次の内容を含む 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;