ホーム>source

フォルダー(およびそのサブフォルダー)内のすべてのファイルに対して正規表現の検索と置換を行う必要があります。それを行うためのLinuxシェルコマンドは何でしょうか?

たとえば、これをすべてのファイルに対して実行し、古いファイルを新しい置き換えられたテキストで上書きします。

<前>ウィズウィズ sed 's/old text/new text/g'
あなたの答え
  • 解決した方法 # 1

    sedだけを使用してそれを行う方法はありません。少なくともfindユーティリティを一緒に使用する必要があります。

    <前>ウィズウィズ

    このコマンドは find . -type f -exec sed -i.bak "s/foo/bar/g" {} \; を作成します  変更されたファイルごとにファイル。

    ノート: 

    ウィズウィズ   .bak の引数  コマンドはGNU拡張なので、このコマンドをBSDの -i で実行している場合  出力を新しいファイルにリダイレクトして、名前を変更する必要があります。

    ウィズウィズ  ユーティリティは sed を実装していません  古いUNIXボックスの引数なので、 sed を使用する必要があります  代わりに。

  • 解決した方法 # 2

    find を使用したい   -exec 以上  覚えやすいから。

    この例では、現在のディレクトリ以下の.txtファイルで「foo」を「bar」にグローバルに置き換えます。

    <前>ウィズウィズ

    ウィズウィズ  そして | xargs  ファイル名にスペースなどのファンキーな文字が含まれていない場合は、オプションを省略できます。

  • 解決した方法 # 3

    移植性については、LinuxまたはBSDに固有のsedの機能には依存しません。代わりに find | xargs cmd を使用します  KernighanとPikeのUnixプログラミング環境に関する本のスクリプト。

    コマンドは

    <前>ウィズウィズ

    そして、 find -exec  スクリプト(私はあちこちで使用しています)は

    <前>ウィズウィズ

    これは、コマンドが成功した場合にのみファイルを上書きするという考え方です。 find . -type f -name "*.txt" -print0 | xargs -0 sed -i "s/foo/bar/g" で役立ちます  また、使用したくない場所

    <前>ウィズウィズ

    シェルは -print0 の前にファイルを切り捨てるため  それを読むことができます。

  • 解決した方法 # 4

    私が提案するかもしれません(ファイルをバックアップした後):

    <前>ウィズウィズ

  • 解決した方法 # 5

    私の大量検索/置換Perlスクリプトを試してみたいかもしれません。チェーンユーティリティソリューションよりもいくつかの利点があります(シェルメタ文字の解釈の複数のレベルを処理する必要がないなど)。

    <前>ウィズウィズ -0

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ 特定の文字列がテキストブロックに存在する必要がある場合に、sed/awkを使用して2つのパターン間でテキストを抽出する方法