41

UNIX上の複数のファイルでコマンドラインの文字列を見つけて置き換えるにはどうすればよいですか?

4

5 に答える 5

48

多くの方法がありますが、答えの1つは次のようになります。

find . -name '*.html' |xargs perl -pi -e 's/find/replace/g'
于 2009-12-13T07:14:51.920 に答える
34

Zombieソリューションのように(そして私が想定しているより高速です) 、Perlの代わりにsed(多くのディストリビューションとOSXで標準)を使用します:

find . -name '*.py' | xargs sed -i .bak 's/foo/bar/g'

これにより、現在のディレクトリの下にあるPythonファイル内のすべてのfooオカレンスがバーに置き換えられ、拡張子が.py.bakの各ファイルのバックアップが作成されます。

そして、de .bakファイルを削除するには:

find . -name "*.bak" -delete
于 2011-05-04T12:38:57.880 に答える
7

私はいつもedスクリプトまたはexスクリプトでそれを行いました。

for i in "$@"; do ex - "$i" << 'eof'; done
%s/old/new/
x
eof

exコマンドは、viの:lineモードです。

于 2009-12-13T07:27:47.890 に答える
6

名前またはスペースを含むディレクトリでfindおよびsedを使用するには、次を使用します。

find . -name '*.py' -print0 | xargs -0 sed -i 's/foo/bar/g'
于 2013-08-24T16:42:47.640 に答える
2

最近のbashシェルを使用し、ディレクトリをトラバースする必要がないと仮定します

for file in *.txt
do
while read -r line
do
    echo ${line//find/replace} > temp        
done <"file"
mv temp "$file"
done 
于 2009-12-13T08:33:11.763 に答える