ディレクトリとサブディレクトリでsedを見つけて置き換えます


244

私はこのコマンドを実行して、サイトのルートにあるすべてのファイルで「apple」のすべての出現箇所を「orange」に置き換えます。

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

しかし、それはサブディレクトリを通過しません。

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

ここにいくつかの出力行がありますfind ./

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

find ./いくつかのサンプル出力を実行して投稿できますか?そしてディレクトリ構造をどうぞ。編集:ありがとう!
ジェイコブ

うーん、あなたの発見は正しいです、私のためにサブディレクトリで動作します。
ジェイコブ

1
それがサブディレクトリを処理しないことをどのようにして知っていますか?
カルペット、2011

これらのエラーが発生するため:sed:./fpdを編集できませんでした:通常のファイルではありませんsed:./fpd/fontを編集できませんでした:通常のファイルではありませんsed:./fpd/font/makefontを編集できませんでした:レギュラではない
hd。

ああ...私はリンゴをgrepして何も見つかりませんでした。すべて置き換えられました。;) ありがとうございました 。あなたは私の目を開いた!!!
hd。

回答:


421

ディレクトリ名がsedに送信されないように、検索結果は次のようになります。

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

19
これを機能させるには、に変更sed -i 's/apple/orange/g'する必要がある場合がありsed -i '' 's/apple/orange/g'ます。
paulmelnikow 2013年

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

20
実際の追加-eはMac OSでは機能しません。touch a b c d e上記のコマンドが続くと、次のようなディレクトリリストが生成されますa a-e b b-e c c-e d d-e e e-e
paulmelnikow 2014年

6
Mac OSの場合、これは、stackoverflow.comRE error: illegal byte sequence
questions / 19242275 /…

3
fishシェルのユーザーの場合、空の括弧を引用符で囲ん'{}'でください。fishは、引用符で囲まないと空の括弧を自動的に展開します。
Kevin Cherepski

84

大規模なs&rタスクの場合は、grepとxargsを使用する方が効率的です。

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

20
この回答をありがとう、それはとても役に立ちました!gitリポジトリ内にある場合、使用するとさらに高速になりますgit grep -l 'apples' | xargs sed -i 's/apples/oranges/g'
mrodrigues

4

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

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

元の質問は* .phpファイルに限定されていません
。.ini

引用符で囲まれ*.phpていないのは本当に間違っています。偶然そこに一致するファイルがないため、開始ディレクトリに展開されなかったことが幸運でした。
Tripleee

3
grep -e apple your_site_root/**/*.* -s -l | xargs sed -i "" "s|apple|orage|"

1

(私がしたように)これを読んでいるmacOSの人々もいるので、次のコードが私のために働いた(10.14)

egrep -rl '<pattern>' <dir> | xargs -I@ sed -i '' 's/<arg1>/<arg2>/g' @

他のすべての回答はmacOS を使用-iして機能-eしません。

ソース



-6

linuxOSの場合:

sed -i 's/textSerch/textReplace/g' namefile

「sed」が機能しない場合は、次を試してください。

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

4
彼は、単一のファイルだけでなく、その文字列を含むサブディレクトリ内のすべてのファイルを検索して置き換えたいと思っています
phuclv
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.