次の文字列を置き換えようとしています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 A
?file B
file 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
/
g
paste
sed
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
バージョンがサポートしているわけではないので、スイッチは省略しました。)