awk 正規表現を使って置換
あるファイルの中の2列目に含まれる "ab" "ac" "ae" という文字列をそれぞれ "zb" "zc" "ze"に置き換えたいのですが、awkまたはsedで正規表現を使って効率のいい方法はないでしょうか。
awk ' { gsub(/ab/,"zb",$2); gsub(/ac/,"zc",$2); gsub(/ae/,"ze",$2); print }' testfile
でやりたいことはできるのですが、「aの後にb,c,eが続く場合にaをzに置換する」というアイディアを使えばもっと効率のよいスクリプトが書けるはず、と思いつつ、awkの勉強を始めたばかりでなかなか思い浮かびません。
testfileの中身は以下の通り:
abcde abaab
aaaae acbec
accee adabd
dceba aeecs
hhhgf sbacc
以下のような出力を望んでいます:
abcde zbazb
aaaae zcbec
accee adzbd
dceba zeecs
hhhgf sbzcc
awk ' BEGIN { var = "[bce]" } { gsub("a"var,"z"var,$2); print }'
だと "zb" "zc" "ze"ではなくすべて"z[bce]"に置き換わってしまうし、
awk ' BEGIN { var = "[bce]" } { gsub("a"var,"z&",$2); print }'
だと"zab" "zac" "zae"になってしまうし…
まずはawk,sedで勉強したいと思っていますが、それ以外でもいい案がありましたら教えてください。よろしくお願いします。
お礼
教えていただけば、簡単にわかるのですが、実際にはそれを探しだすことがかなり大変なので、とても助かりました。これからも勉学に励みたいと思います。ありがとうございました。