首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在两个匹配的模式之间、第二个模式之前插入一行

如何在两个匹配的模式之间、第二个模式之前插入一行
EN

Stack Overflow用户
提问于 2017-03-03 22:56:43
回答 4查看 86关注 0票数 1

我正在尝试将特定网络设备的"dns-nameservers x.x“行添加到/etc/ ethX /interface(这是可以更改的,它可能是另一个文件中的另一个行)。

也就是说,要将dns-nameservers添加到em1中,我想使用如下命令:

代码语言:javascript
复制
sed -i '/^auto em1/,/^auto/ .....' /etc/network/interfaces

目前:

代码语言:javascript
复制
auto lo
iface lo inet loopback
auto em1
iface em1 inet static
address 192.168.2.98
netmask 255.255.255.0
gateway 192.168.2.1
auto eth1
iface eth1 inet static
address 192.168.3.155
netmask 255.255.255.0
dns-nameservers 8.8.8.8

我想要的是:

代码语言:javascript
复制
auto lo
iface lo inet loopback
auto em1
iface em1 inet static
address 192.168.2.98
netmask 255.255.255.0
gateway 192.168.2.1
dns-nameservers x.x.x.x (<- this line inserted)
auto eth1
iface eth1 inet static
address 192.168.3.155
netmask 255.255.255.0
dns-nameservers 8.8.8.8

提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-03-03 23:30:31

满足您当前和未来需求的解决方案是将与给定设备关联的每组行保存为单个记录,然后从函数打印它,例如:

代码语言:javascript
复制
$ awk '/^auto/{prtDev()} {dev = dev $0 ORS} END{prtDev()}
    function prtDev() {printf "%s", dev; dev=""}' file
auto lo
iface lo inet loopback
auto em1
iface em1 inet static
address 192.168.2.98
netmask 255.255.255.0
gateway 192.168.2.1
auto eth1
iface eth1 inet static
address 192.168.3.155
netmask 255.255.255.0
dns-nameservers 8.8.8.8

虽然这看起来只是按原样打印输入文件,但看看它是多么容易,然后只需调整函数,让它在第二个设备的末尾添加一行:

代码语言:javascript
复制
$ awk '/^auto/{prtDev()} {dev = dev $0 ORS} END{prtDev()}
    function prtDev() {printf "%s", dev; if (cnt++ == 2) print "dns-nameservers x.x.x.x"; dev=""}' file
auto lo
iface lo inet loopback
auto em1
iface em1 inet static
address 192.168.2.98
netmask 255.255.255.0
gateway 192.168.2.1
dns-nameservers x.x.x.x
auto eth1
iface eth1 inet static
address 192.168.3.155
netmask 255.255.255.0
dns-nameservers 8.8.8.8

或者只打印设备“em1”的记录:

代码语言:javascript
复制
$ awk '/^auto/{prtDev()} {dev = dev $0 ORS} END{prtDev()}
    function prtDev() {if (dev ~ / em1 /) printf "%s", dev; dev=""}' file
auto em1
iface em1 inet static
address 192.168.2.98
netmask 255.255.255.0
gateway 192.168.2.1

或者匹配特定的网关IP地址,或者仅匹配环回,或者您可能想要选择或操作的任何其他内容,或者您想要打印的特定行,或者基于每个设备的任何其他内容。

票数 3
EN

Stack Overflow用户

发布于 2017-03-03 23:12:15

awk出手相救!

代码语言:javascript
复制
$ awk '/^auto em1/       {f=1} 
       /^auto eth1/ && f {print "NEW LINE GOES HERE"; f=0}1' file

auto lo
iface lo inet loopback
auto em1
iface em1 inet static
address 192.168.2.98
netmask 255.255.255.0
gateway 192.168.2.1
NEW LINE GOES HERE
auto eth1
iface eth1 inet static
address 192.168.3.155
netmask 255.255.255.0
dns-nameservers 8.8.8.8

通过一个例子来澄清注释:匹配将在文件之间继续(如果找到超过一对开始/结束模式,则循环)。例如

代码语言:javascript
复制
$ awk '/^3/     {f=1} 
       /^6/ && f{print "HERE"; f=0}1' <(seq 5) <(seq 4 7)

1
2
3
4
5
4
5
HERE
6
7

第一个输入文件没有结尾模式(即6),但搜索继续在第二个文件上进行。

如果这不是缩进行为,请澄清问题。

票数 3
EN

Stack Overflow用户

发布于 2017-03-03 23:44:15

这可能适用于您(GNU sed):

代码语言:javascript
复制
sed '/^auto em1/!b;:a;$bb;n;/^auto/!ba;:b;idns-nameservers x.x.x.x' file

在遇到auto em1时,在此之后打印各行,并在启动auto的下一行之前插入所需的字符串。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42582066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档