我有 2 个文件,atana1 和 atana2,其内容如下:
$ cat atana1 :
location
allow 127.0.0.1;
deny all;
$ cat atana2
27.0.12.12
=>我想通过 sed 和文件 atana2 中的输入条件替换字符串 27.0.12.12 => 127.0.0.1 。
我正在尝试命令:
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
这将替换第二行中的第一次出现。
输出:
location
allow 27.0.12.12; allow 127102031;
deny all;
127102031 127102031
多个实例,例如以下示例:
location
allow 127.0.0.1; allow 127102031;
deny all;
127102031 127102031
第二行第二次出现:
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;