2011-07-20 8 views
146

にsedので、私は私のサイトのルートにあるすべてのファイルの「オレンジ」と「りんご」の出現をすべて検索と置換するには、次のコマンドを実行します。検索と置換のディレクトリおよびサブディレクトリ

find ./ -exec sed -i 's/apple/orange/g' {} \; 

が、それはdoesnのサブディレクトリには行きません。

このコマンドで何が問題になっていますか?

編集:ここで見つけるの出力のいくつかの行がある./コマンド:

./index.php 
./header.php 
./fpd 
./fpd/font 
./fpd/font/desktop.ini 
./fpd/font/courier.php 
./fpd/font/symbol.php 
+0

あなたが見つける '実行することができます/'とポストいくつかのサンプル出力:

"sedの" 場合
sed -i 's/textSerch/textReplace/g' namefile 

は試して動作しませんか?そしてディレクトリ構造をお願いします。編集:ありがとう! – Jacob

+0

あなたの発見は正しいです、私のためのsubdirsで動作します。 – Jacob

+1

サブディレクトリを処理しないことをどのように知っていますか? – carlpett

答えて

258

あなたの検索はsedのためにディレクトリ名を送信することを避けるためにそのようになります。

find ./ -type f -exec sed -i -e 's/apple/orange/g' {} \; 
+10

'sed -i '/ apple/orange/g''を' sed -i' 's/apple/orange/g''に変更する必要があるかもしれません。 – paulmelnikow

+4

'-i'は、一時ファイルを保存するために使用される拡張子を引数に取ります。 GNU sedでは、 '-i'とその引数の間にスペースがないように見えますが、BSD sedではBSD' -i '' 's/foo/bar /' 'はGNU' -i '/foo/bar/'と入力します。 – paulmelnikow

+13

実際に '-e'を追加してもMac OSでは動作しません。上記のコマンドの後に「touch a b c d e」と入力すると、「a-e b b-e c c-e d d-e e-e」のようなディレクトリリストが生成されます。 – paulmelnikow

5

これは私のために働きました:

find ./ -type f -exec sed -i '' 's#NEEDLE#REPLACEMENT#' *.php {} \; 
1

は、私たちは1行の簡単なコマンドでこれを行うことができると思い

for i in `grep -rl eth0 . 2> /dev/null`; do sed -i ‘s/eth0/eth1/’ $i; done 

pageを参照してください。

+1

http:// mywiki.wooledge.org/DontReadLinesWithFor – tripleee

47

より大きいsの& rタスクでは、grepとxargsを使用するほうがずっと速くなります。 linuxOSで

grep -rl 'apples' /dir_to_search_under | xargs sed -i 's/apples/oranges/g' 
+9

この回答をお寄せいただきありがとうございました。 gitリポジトリ内にある場合は、 'git grep -l 'apples' | xargs sed -i/apples/oranges/g'' – mrodrigues

-3

:。

perl -i -pe 's/textSerch/textReplace/g' namefile 
+2

彼はサブディレクトリ内のすべてのファイルがその文字列を含み、単一のファイルだけでなく –

0
grep -e apple your_site_root/**/*.* -s -l | xargs sed -i "" "s|apple|orage|" 
関連する問題