読者です 読者をやめる 読者になる 読者になる

grep/ack/ag でのエスケープがわからないなら直接文字列リテラル渡せばいいじゃない

適当にエスケープしてメタ文字消して置換しようとしたけど、正直よくわからなかった。たとえばこういうもの

Obj.objects.create(**kwargs)

こういうとき愚直に「. をエスケープして……あれ()ってクオートで囲むの……あれ……」とかやってた

別に単純な文字列のマッチでよかった

そういうときには grep なら -F, ag なら -Q というオブションがある

# grep
grep -rF "Obj.objects.create(**kwargs)" ./
# ag
ag -Q "Obj.objects.create(**kwargs)"

あとは煮るなり焼くなり

# -l でファイル出力して xrags で受け取る
ag -lQ "Obj.objects.create(**kwargs)" | xargs sed -i "s/Obj\.objects\.create(**kwargs)/oyaoya/g"

はい

真面目に正規表現で必要ならいいけど、単純な文字列置換したいだけならこの方が楽。ほんとうは sed 側も正規表現じゃなくて直接置換できるといいんだけど、 d で消して a で追加とかなのかな?ちょっと調べたけどわからなかった。