文字列リストとその代替リストに基づいてファイル内の文字列を置き換える

文字列リストとその代替リストに基づいてファイル内の文字列を置き換える

次の文字列を置き換えようとしていますfile A

Hello Peter, how is your dad? where is mom? 

置き換える文字列は次の場所にありますfile B

Peter
dad
mom

対応する代替項目は次の場所にありますfile C

John
wife
grandpa

予想される結果:

Hello John, how is your wife? where is grandpa?

の値をの対応する行値に編集して置き換えることはできますかfile Afile Bfile C

これまで私がしたこと:

 cat 1.txt | sed -e "s/$(sed 's:/:\\/:g' 2.txt)/$(sed 's:/:\\/:g' 3.txt)/" > 4.txt

file B& に 1 行だけあれば有効でfile C、 2 行以上あれば有効ではありません。

ベストアンサー1

最も簡単な方法sedは、これら2つのリストを処理して1つに置き換えることです。スクリプトファイル例えば

s/line1-from-fileB/line1-from-fileC/g
s/line2-from-fileB/line2-from-fileC/g
....................................
s/lineN-from-fileB/lineN-from-fileC/g

その後、sed実行してfileA編集します。適切アプローチは、最初にLHS/を処理しRHS、その行に現れる可能性がある特殊文字をエスケープしてから、区切り文字とwithなどを組み合わせて追加し、LHS結果RHSを次にパイプすることです。s/gpastesed

paste -ds///g /dev/null /dev/null \
<(sed 's|[[\.*^$/]|\\&|g' fileB) <(sed 's|[\&/]|\\&|g' fileC) \
/dev/null /dev/null | sed -f - fileA

したがって、onepasteとthreeは、sed行数に関係なく各ファイルを一度だけ処理します。
これは、シェルがプロセス置換をサポートし、以下をsed読み取ることができると仮定します。スクリプトファイル~から標準入力。また、その場で編集できません。 (-iすべてのsedバージョンがサポートしているわけではないので、スイッチは省略しました。)

おすすめ記事