插入到文本文件sed中的一行中间

时间:2017-09-18 15:00:32

标签: sed

我是sed脚本的新手。我一直在研究如何将文本添加到文件中的一行。

所以我在文本文件中的行看起来像这样

hosts allow = 192.168.122. 172.24.0 

我想添加IP,所以行看起来像

hosts allow = 192.168.122. 192.12.0 172.24.0

通过反复试验,我只有:

sed -i '/allow/ s/.*/&,192.12.0./' testfile

给出:

hosts allow = 192.168.122. 172.24.0. 192.12.0.

3 个答案:

答案 0 :(得分:0)

检查此测试:

$ cat file1
hosts allow = 192.168.122. 172.24.0
hosts allow = 111.111.111. 222.222.222 333.333.333

$ sed -E 's/(.* = .*)( .*)/\1 george \2/g' file1
hosts allow = 192.168.122. george  172.24.0
hosts allow = 111.111.111. 222.222.222 george  333.333.333

$ sed -r 's/(.* = .[^ ]*)(.*)/\1 george \2/g' file1
hosts allow = 192.168.122. george  172.24.0
hosts allow = 111.111.111. george  222.222.222 333.333.333

此测试使用带有扩展正则表达式支持的sed(-E或-r开关)和捕获()

中包含的组

答案 1 :(得分:0)

你的问题太模糊了,不能肯定地说(你想在一个集合的中间或在第一个之后或在最后一个之前或在固定位置或其他地方添加字符串)但这可能是什么你在寻找:

$ sed 's/ [^[:space:]]*/& 192.12.0/2' file
hosts allow = 192.12.0 192.168.122. 172.24.0

$ sed 's/ [^[:space:]]*/& 192.12.0/3' file
hosts allow = 192.168.122. 192.12.0 172.24.0

$ sed 's/ [^[:space:]]*/& 192.12.0/4' file
hosts allow = 192.168.122. 172.24.0 192.12.0

答案 2 :(得分:0)

这是一个awk解决方案,我发现它比sed解决方案更清晰:

awk '$1$2$3 == "hostsallow=" { $NF="192.12.0 $NF" } { print }' \
  testfile > tmp && mv tmp testfile

这需要前三列并确保它们连接到“hostsallow =”而没有空格(我怀疑你会遇到host sallow = …行),然后取最后一列的值(标识为{{ 1}}表示字段数,其值用NF标识,并为其分配新值,空格和旧值。然后打印所有行。警告,这将折叠空白(在这种情况下,我将其视为一个功能)。

不幸的是,awk没有像sed那样的$选项,因此必须将其保存在临时文件中,然后放回原始文件的顶部。