入力があります。
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
されます(またはより一般的には、置換は、次を含む入力で発生する可能性があるように新しい発生を生成しません)。TOCHANGE
externalfile
TOCHANGE
TOTOCHANGE FROMTOCHANGE
externalfile
CHANGE
WHATEVER
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=1
GNUはawk
これを要求します。そうしないと、バックスラッシュ文字を含む文字列を正しく置き換えることはできません。)
上記は$PAT
拡張正規表現と見なされます。文字通り処理するには(文字列のPAT='TO\.CHANGE'
置換など)、ERE演算子をエスケープする必要があります。TO.CHANGE