私はファイルを持っています、例えばmap.txt
、検索文字列と対応する置換のリストが含まれています。
search -> replacement
bigBone -> bb
fishMarket -> fm
dogCollar -> dc
...
シンボリックリンクを除くフォルダ内のすべてのファイルについて、上記に一致するすべての文字列の検索と置換を再帰的に実行する必要があります。私はこのように一度に1つずつそれを行う方法を知っています:
$ find /some/folder -type f -exec sed -i 's/old_text/new_text/g' {} \;
上記のマッピングを使用して、これを大規模に実行するにはどうすればよいですか? この質問 を読みましたが、よくわかりません。
速度が気にならない場合(これは1回限りのタスクです)、次のことを試してみてください。
cat map.txt | while read line; do
neww=${line##* };
oldw=${line%% *};
find /some/folder -type f -exec sed -i "s/$oldw/$neww/g" {} \;
done
最適ではない、私は知っている... :-P
PS:テストフォルダをチェックインして、機能するかどうかを確認してください。
基本的に:
$oldw
と交換$neww
。変数を設定するために$oldw
および$neww
各行の最初と最後の単語を取得する必要があります。そのために、パラメーター展開(純粋なBash実装)を使用していますが、他の方法を使用して文字列の最初と最後の単語を取得することもできます(つまり、cut
またはawk
)。
${line##* }
:変数line
から、最大のプレフィックスを削除します(double #
)pattern、ここでpatternは任意の文字(*
)の後にスペース()が続きます。したがって、line
の最後の単語を取得します。${line%% *}
:変数line
から、最大のサフィックスを削除します(double %
)pattern。ここで、patternはスペース()の後に任意の文字(*
)。したがって、line
の最初の単語を取得します。この場合、単語はスペースで区切られていましたが、任意の区切り文字を使用できました。
設定ファイル内の用語を検索して置き換える必要がある場合があります。
Githubで利用可能なスクリプトを作成しました sandr-検索と置換 マップの作成/使用とファイルの置換の実行を許可します。
使用例:
$ cat file
Voyez ce jeu exquis wallon, de graphie en kit mais bref. Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à côté de l'alcôve ovoïde, où les bûches se consument dans l'âtre, ce qui lui permet de penser à la cænogenèse de l'être dont il est question dans la cause ambiguë entendue à Moÿ, dans un capharnaüm qui, pense-t-il, diminue çà et là la qualité de son œuvre. Prouvez, beau j
$ cat map.txt
wallon => WALLON
se => SE
penser => PENSER
beau => BEAU
$ cat file | ./sandr -a map.txt
Voyez ce jeu exquis WALLON, de graphie en kit mais bref. Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à côté de l'alcôve ovoïde, où les bûches SE consument dans l'âtre, ce qui lui permet de PENSER à la cænogenèSE de l'être dont il est question dans la cauSE ambiguë entendue à Moÿ, dans un capharnaüm qui, penSE-t-il, diminue çà et là la qualité de son œuvre. Prouvez, BEAU j