sed -i 呼び出しにはどのような問題がありますか?

sed -i 呼び出しにはどのような問題がありますか?

この行があります。

find . -type f \( ! -name '*.plist' \) -and \( ! -name '*.mp4' \) -and \( ! -name '.DS*' \) -print0 | xargs -0 sed -i 's/AAA/BBB/g'

私の目的は、.plist、.mp4、および.DS *拡張子を持つファイルを除いて、現在のディレクトリ内のすべてのファイルからすべてのAAAエントリをBBBに繰り返し変更することです。

しかし、メッセージを受け取りました。

sed: 1: "./myDir/pro ...": invalid command code .

答え1

最も簡単な解決策は、次を使用することです。

find . -type f \( ! -name '*.plist' \) -and \( ! -name '*.mp4' \) -and \( ! -name '.DS*' \) -print0 | xargs -0 perl -pi -w -e  's/AAA/BBB/g'

答え2

GNU sedとは異なり、Mac OSXに付属のsedには-iバックアップサフィックスを指定するオプション引数が必要です。バックアップを抑制するには、空の文字列('')を渡す必要があります。したがって、sedはyourをs/AAA/BBB/バックアップサフィックスとして解釈し、最初のファイル名(./myDir/pro ...)を実行するコマンドとして解釈します。もちろん、.これは有効なsedコマンドではないため、エラーが発生します。これを念頭に置いて、次はうまくいきます。

find [...] | xargs -0 sed -i.bak 's/AAA/BBB/g'

またはバックアップ抑制に固執する場合

find [...] | xargs -0 sed -i '' 's/AAA/BBB/g'

関連情報