web-dev-qa-db-ja.com

コマンドラインで複数のファイルを検索して置換する

UNIXの複数のファイルでコマンドラインの文字列を検索して置換するにはどうすればよいですか?

36
Vijay

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

find . -name '*.html' |xargs Perl -pi -e 's/find/replace/g'
47
Vijay

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

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

これにより、現在のディレクトリの下にあるPythonファイル内のすべてのfooの出現がbarそして、。py.bak拡張子を持つ各ファイルのバックアップを作成します。

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

find . -name "*.bak" -delete
25
Stan

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

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

exコマンドは、viの:行モードにすぎません。

6
DigitalRoss

名前を使用して検索またはsedを使用するか、スペースを含むディレクトリを使用するには、次のようにします。

find . -name '*.py' -print0 | xargs -0 sed -i 's/foo/bar/g'
5
XavierCLL

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

for file in *.txt
do
while read -r line
do
    echo ${line//find/replace} > temp        
done <"file"
mv temp "$file"
done 
2
ghostdog74