Sed 条件替换从文件中读取

Sed 条件替换从文件中读取

我有 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;

相关内容