私はディレクトリ全体で特定の文の出現を見つけて他の文に置き換えるために、そして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
grep
2段階のプロセスでこれを行うことができます。最初のステップでは、タブ区切りの表ファイルを使用して&コマンドセットを作成し、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を使用する必要があります。backslash
t