findとsedを使用してファイル内の特定の文を置き換える方法

findとsedを使用してファイル内の特定の文を置き換える方法

私はディレクトリ全体で特定の文の出現を見つけて他の文に置き換えるために、そしてfindコマンドを使用しています。sed

たとえば、特定のディレクトリ()内のすべてのファイルの文のすべてのエントリをtoに置き換えるには、He went次のようにします。She goes\home\user\

find '/home/user' -type f | xargs sed -i  's/He went/She goes/g'

さて、上記のコマンドを実行し、いくつかの文を実行したいと思います。この目的のために、左側に変更したい文章があり、右側には新しい文章を含むタブ区切りファイルがあります。

例えば

He went\tShe goes
<h1>They tried<\h1>\t<h2>They did not try<\h2>

手動で文をインポートするのではなく、タブで区切られたファイルに対応するように上記のコマンドを変更する方法はありますか?

答え1

grep2段階のプロセスでこれを行うことができます。最初のステップでは、タブ区切りの表ファイルを使用して&コマンドセットを作成し、sedそれらを見つけることができないように別の階層に保存するため、find変更の可能性があります。

##1> generate commands
sed -E '
  h;s/.*\t//
  # escape characters special on rhs
  s:[\&/]:\\&:g

  # grep code
  x;s/\t.*//w/tmp/code.grep

  # lhs escaping
  s:[][$^.*\/]:\\&:g;G

  # stitch lhs rhs & form a s/// 
  s:^|\n|$:/:g;s/.*/s&g/

' file.cmds > /tmp/code.sed

##2> use the commands

find /home/user -type f \
  -exec grep -qF -f /tmp/code.grep {} \; \
  -exec sed -i -f /tmp/code.sed {} + ;


  • 動的に生成されたコードファイルを検索している階層とは異なる階層に配置する必要があります。

  • テーブルファイルは、コード生成中に2つの文字と後にアルファベットが続くものとして\t 扱われるため、シンボルの代わりにリテラルTABを使用する必要があります。backslasht

関連情報