で{}
これを行うことができるかどうか疑問に思います。sed
find -exec
一例:
find "$dir" -type f -name "*" -exec sed -i s/hello{}a/hello{}b/g '{}' +
重複したエラーメッセージが表示されます{}
。
find: Only one instance of {} is supported with -exec ... +
見つかったファイルを置き換えるのではなく、コマンド{}
に残ってリテラルとして処理される方法はありますか?sed
find
答え1
この場合、中find
括弧式をキャプチャし、代替テキストの逆参照を使用してexec構文を解決できます。
$ cat f1 f2
f1: hello{}a
f2: hello{}a
$ find . -type f -exec sed -i 's/hello\([{][}]\)a/hello\1b/g' '{}' +
$ cat f1 f2
f1: hello{}b
f2: hello{}b
またはもっと簡単です(説明で述べたように)。
find "$dir" -type f -exec sed -i 's/\(hello[{]}\)a/\1b/g' {} +
Sedのオプションは-i
移植性がなく、どこでも機能しません。指定されたコマンドはGNU Sedでのみ機能します。
詳細については、次を参照してください。
答え2
一方では+
これを使用しており、これは次のようなものを入れる-exec
ことができることを意味します。多くの種類代わりに{}
引数を使用すると、所望の結果が得られずsed
(実装によって非常に異なりますが)、単純に+
。
ただし、これを行う一般的な方法は、次のものを使用することですsh -c
。
find "$dir" -type f -exec sh -c 'sed -i "s/hello$1a/hello$1b/g" "$1"' sh {} \;