Sed条件付き置換がファイルから読み取られます。

Sed条件付き置換がファイルから読み取られます。

次の内容を含む atana1 と atana2 という 2 つのファイルがあります。

$ cat atana1 :

location
allow 127.0.0.1;
deny all;


$ cat atana2
27.0.12.12

=> sedで文字列27.0.12.12 => 127.0.0.1とatana2ファイルの入力条件を変更したい

私はコマンドを試しています:

sed '/127.0.0.1/r atana2' atana1

出力:

location
allow 127.0.0.1;
27.0.12.12
deny all;

== >>私の意図は、atana2行から条件を読み取り、sedコマンドを介して文字列127.0.0.1を置き換えることです。

希望の出力:

location
allow 27.0.12.12;
deny all;

それを使わずに:

sed -i 's/127.0.0.1/27.0.12.12/g' file.txt

答え1

これをしてはいけない理由:

replace="$(cat atana2)"

sed "s|127.0.0.1|$replace|" atana1

一重引用符を二重引用符に置き換えると、sed変数拡張が発生します。

出力:

location
allow 27.0.12.12;
deny all;

何が欲しいのか分からない場合は、次の操作を行います。

sed -i "s|127.0.0.1|$replace|" atana1

この場合、何の影響もありませんが、127102031その文字列が置き換えたい項目の前に来ると、その文字列はすべての文字に展開されるため、.その文字列も置き換えられます。後で同様のファイルがある場合は、次の例に示すように、特定の行でそのファイルを置き換えます。

location
allow 127.0.0.1; allow 127102031;
deny all;
127102031 127102031

パスワード:

sed "2s|127.0.0.1|$replace|" atana1

これにより、2行目の最初の項目が置き換えられます。

出力:

location
allow 27.0.12.12; allow 127102031;
deny all;
127102031 127102031

次の例のような複数のインスタンス:

location
allow 127.0.0.1; allow 127102031;
deny all;
127102031 127102031

2行目が2番目に表示されます。

sed "2s|127.0.0.1|$replace|2" atana1

出力:

location
allow 127.0.0.1; allow 27.0.12.12;
deny all;
127102031 127102031

この場合でも、問題なく最初に使用したものを使用できますが、これは後で参照用であり、ファイルが異なる場合があります。

答え2

awkコマンドを試してください

i=`cat `

awk -v i="$i" '{gsub("127.0.0.1",i,$0);print }'  atana1

出力

location
allow 27.0.12.12;
deny all;

関連情報