パターンを毎回別の文字列に置き換えます(外部ファイルから取得)

パターンを毎回別の文字列に置き換えます(外部ファイルから取得)

入力があります。

a
b TOCHANGE
c
d 
e TOCHANGE

外部ファイルを使用して「TOCHANGE」モードを変更する必要があります。

line1
line2
...

これにより、次のような結果が得られます。

a
b line1    
c
d
e line2

次のコマンドを試しました。

while read k ; do sed -i "s/TOCHANGE/$k/g" input ; done < externalfile

しかし、私は次のようになります。

a
b line1    
c
d
e line1

ベストアンサー1

そしてperl

perl -pi -e 's{TOCHANGE}{chomp ($repl = <STDIN>); $repl}ge' input <externalfile

の場合、以下で発生が発生しないと仮定awkされます(またはより一般的には、置換は、次を含む入力で発生する可能性があるように新しい発生を生成しません)。TOCHANGEexternalfileTOCHANGETOTOCHANGE FROMTOCHANGEexternalfileCHANGEWHATEVER

POSIXLY_CORRECT=1 PAT=TOCHANGE awk '
  {
    while ($0 ~ ENVIRON["PAT"]) {
      getline repl < "externalfile"
      gsub(/[&\\]/, "\\\\&", repl)
      sub(ENVIRON["PAT"], repl)
    }
    print
  }' < input > input.new

POSIXLY_CORRECT=1GNUはawkこれを要求します。そうしないと、バックスラッシュ文字を含む文字列を正しく置き換えることはできません。)

上記は$PAT拡張正規表現と見なされます。文字通り処理するには(文字列のPAT='TO\.CHANGE'置換など)、ERE演算子をエスケープする必要があります。TO.CHANGE

おすすめ記事