web-dev-qa-db-ja.com

1行のシェルコマンドを使用してすべてのファイルの特定のテキストを置き換える

名前を変更したjsファイルがあり、これを各phpページで呼び出す必要があります。シェルを使用して、古い名前を新しい名前に置き換えたいと思います。 Iamが使用しているのはこれです。

sed -i ’s/old/new/g’ *

しかし、これは次のエラーを出しています:-

sed: -e expression #1, char 1: unknown command:

どうすればこの置換を行うことができますか?

36
developer

おそらくより冗長な解決策はありますが、ここで私たちは行きます:

for i in *; do sed -i 's/old/new/g' "$i"; done

ちなみに、これはファイルシステムの現在のレベルでのみ機能し、サブディレクトリ内のファイルは変更されません。また、*を* .phpに置き換えるか、バックアップを作成することもできます(-iの後に引数を渡すと、指定した拡張子でバックアップが作成されます)。

31
K. Norbert
sed -i.bak 's/old/new/g' *.php

再帰的に行う

find /path -type f -iname '*.php' -exec sed -i.bak 's/old/new/' "{}" +;
50
ghostdog74

sedコマンド引数の周りにASCII(0x27)アポストロフィの代わりに、Unicodeアポストロフィ(RIGHT SINGLE QUOTATION MARK-U2019)を使用しています。

これは非常にシンプルで、forまたはループがなく、任意の数またはネストされたディレクトリを処理します

grep -rl 'oldText' [folderName-optional] | xargs sed -i 's/oldText/newText/g'

9
user7154703
Perl -pi -e 's/old/new/g' *.php
4
radio4fan

私は本当に遅れていることを知っていますが、それでも:

find . -type f -name "*.php"|xargs sed -i 's/old/new/g'
4
Ziyad

完全を期すために、上記の受け入れられた回答のOSX互換バージョンを提供する(@jamescampbellからのコメントに回答するため)

for i in *.php; do sed -i .orig 's/old/new/g' "$i"; done

このコマンドは、.origバックアップファイルを作成します。

2
shiramy