UNIXの複数のファイルでコマンドラインの文字列を検索して置換するにはどうすればよいですか?
多くの方法があります。しかし、答えの1つは次のようになります。
find . -name '*.html' |xargs Perl -pi -e 's/find/replace/g'
ゾンビソリューションのように(そして私が想定しているより高速ですが)、Perlの代わりにsed(多くのディストリビューションおよびOSXの標準)を使用します。
find . -name '*.py' | xargs sed -i .bak 's/foo/bar/g'
これにより、現在のディレクトリの下にあるPythonファイル内のすべてのfooの出現がbarそして、。py.bak拡張子を持つ各ファイルのバックアップを作成します。
そして.bakファイルを削除するには:
find . -name "*.bak" -delete
私はいつもedスクリプトまたはexスクリプトでそれを行いました。
for i in "$@"; do ex - "$i" << 'eof'; done
%s/old/new/
x
eof
exコマンドは、viの:行モードにすぎません。
名前を使用して検索またはsedを使用するか、スペースを含むディレクトリを使用するには、次のようにします。
find . -name '*.py' -print0 | xargs -0 sed -i 's/foo/bar/g'
最近のbashシェルを使用し、ディレクトリを走査する必要がないと仮定します
for file in *.txt
do
while read -r line
do
echo ${line//find/replace} > temp
done <"file"
mv temp "$file"
done