sed在匹配前插入包括前导换行符

sed在匹配前插入包括前导换行符,sed,Sed,需要编辑一个.conf文件 #8889 = 192.168.27.128:22 [incomingudp] # UDP port forwarding example 我想在匹配前插入一行,如下所示: #8889 = 192.168.27.128:22 3306 = 192.168.159.128:3306 [incomingudp] # UDP port forwarding example #8889 = 192.168.27.128:22 3306 = 192.168.159.1

需要编辑一个.conf文件

#8889 = 192.168.27.128:22

[incomingudp]
# UDP port forwarding example
我想在匹配前插入一行,如下所示:

#8889 = 192.168.27.128:22
3306 = 192.168.159.128:3306

[incomingudp]
# UDP port forwarding example
#8889 = 192.168.27.128:22

3306 = 192.168.159.128:3306
[incomingudp]
# UDP port forwarding example
但不是这样:

#8889 = 192.168.27.128:22
3306 = 192.168.159.128:3306

[incomingudp]
# UDP port forwarding example
#8889 = 192.168.27.128:22

3306 = 192.168.159.128:3306
[incomingudp]
# UDP port forwarding example
按脚本[NG]:

sed "/\[incomingudp\]/i [Q1]" vmnetnat.conf
此外,当文件中有一行以
3306=

开头时,我想替换该行。您可以尝试以下操作:

awk '
    /3306 = /{ignore=1}
    (FNR==position && !ignore){print "3306 = 192.168.159.128:3306"}
    !$0{newline=FNR}
    /\[incomingudp\]/&&(FNR==newline+1){position=newline}
    NR!=FNR
' <file> <file>
awk'
/3306=/{ignore=1}
(FNR==位置&忽略){print“3306=192.168.159.128:3306”}
!$0{newline=FNR}
/\[incomingudp\]/&(FNR==newline+1){position=newline}
NR=FNR
'  
要替换该文件,可以执行以下操作:

awk '
    /3306 = /{ignore=1}
    (FNR==position && !ignore){print "3306 = 192.168.159.128:3306"}
    !$0{newline=FNR}
    /\[incomingudp\]/&&(FNR==newline+1){position=newline}
    NR!=FNR
' <file> <file> > tmp && mv tmp <file>
awk'
/3306=/{ignore=1}
(FNR==位置&忽略){print“3306=192.168.159.128:3306”}
!$0{newline=FNR}
/\[incomingudp\]/&(FNR==newline+1){position=newline}
NR=FNR
'>tmp&mv tmp
或者你也可以这样做:

awk '
    /3306 = /{exit 1}
    (FNR==position){print "3306 = 192.168.159.128:3306"}
    !$0{newline=FNR}
    /\[incomingudp\]/&&(FNR==newline+1){position=newline}
    NR!=FNR{print $0}
' <file> <file> > tmp && mv tmp <file> || rm tmp
awk'
/3306=/{exit 1}
(FNR==位置){打印“3306=192.168.159.128:3306”}
!$0{newline=FNR}
/\[incomingudp\]/&(FNR==newline+1){position=newline}
NR=FNR{打印$0}
'>tmp&mv tmp | | rm tmp

为什么?与awk配合良好