web-dev-qa-db-ja.com

複数のファイルの置換リストに一致する文字列を検索して置換する方法

私はファイルを持っています、例えば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' {} \;

上記のマッピングを使用して、これを大規模に実行するにはどうすればよいですか? この質問 を読みましたが、よくわかりません。

5

回答

速度が気にならない場合(これは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:テストフォルダをチェックインして、機能するかどうかを確認してください。

説明

基本的に:

  1. Catファイルmap.txt。
  2. 各行を読んで、単語を置き換えてください$oldwと交換$neww
  3. ペアごとに、すでに使用していたfindコマンドを実行します(変数の置換を可能にするために、今回は二重引用符に注意してください)。

パラメータ展開について

変数を設定するために$oldwおよび$neww各行の最初と最後の単語を取得する必要があります。そのために、パラメーター展開(純粋なBash実装)を使用していますが、他の方法を使用して文字列の最初と最後の単語を取得することもできます(つまり、cutまたはawk)。

  • ${line##* }:変数lineから、最大のプレフィックスを削除します(double #)pattern、ここでpatternは任意の文字(*)の後にスペース()が続きます。したがって、lineの最後の単語を取得します。
  • ${line%% *}:変数lineから、最大のサフィックスを削除します(double %)pattern。ここで、patternはスペース()の後に任意の文字(*)。したがって、lineの最初の単語を取得します。

この場合、単語はスペースで区切られていましたが、任意の区切り文字を使用できました。

4
Peque

設定ファイル内の用語を検索して置き換える必要がある場合があります。

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
0
kitekat75