0

次のコマンドを使用して、bash で複数のファイルを検索/置換するのが大好きです。

find -wholename "*.txt" -print | xargs sed -i 's/foo/bar/g'

ただし、上記のコマンドはすべてを静かに処理します。すべてが正しく行われたかどうかを再確認するために、上記のコマンドで行ったすべての変更を出力したい場合があります。上記のコマンドを改善して、そのような情報をダンプできるようにする方法を教えてください。コマンドで-v引数を試しましたが、エラーが発生します。xargsinvalid option

4

3 に答える 3

1

次のようなことができます:

find -wholename "*.txt" | xargs sed -n '/foo/p;s/foo/bar/gp'

これが行うことは、置換したい行を出力し、次の行に置換を出力することです。

ファイル名も使用awkおよび取得できます。

find -wholename "*.txt" | xargs awk '/foo/{print FILENAME; gsub(/foo/,"bar");print}'

ファイル全体を印刷するには、削除printして追加します1

find -wholename "*.txt" | xargs awk '/foo/{print FILENAME; gsub(/foo/,"bar")}1'

正規表現は要件に応じて変更する必要があり、ファイル内の変更はgawk version 4.1

テスト:

$ head file*
==> file1 <==
,,"user1","email"
,,"user2","email"
,,"user3","email"
,,"user4","email"

==> file2 <==
,,user2,location2
,,user4,location4
,,user1,location1
,,user3,location3
$ find . -name "file*" -print | xargs awk '/user1/{print FILENAME; gsub(/user1/,"TESTING");print}'
./file1
,,"TESTING","email"
./file2
,,TESTING,location1
 
于 2013-06-26T05:14:15.360 に答える
1

すべてで実行できます。少しだけ変更が必要です:

find -path "*.txt" -exec sed -i.bak 's/foo/bar/g' {} +

これは、ファイルの最大数で+を呼び出すため (末尾に-exec注意)、は必要ありません。In -i.bakは、元のファイルの名前を として変更するインプレース編集を行います.bak。そのため、必要に応じて後で違いを確認できます。

読むman findことができます:

-wholename pattern
      See -path.    This alternative is less portable than -path.
于 2013-06-26T07:44:58.547 に答える