我想加一行
allow = alaw
在字符串之前
nat = no
在文件sip.conf
(或任何基于文本的文件)中。如果allow = alaw
已经存在,nat = no
则不应添加。并且不应在该文件的[general]
和之后的两部分中添加该行[providertrunk0]
。
[general]
disallow = all
allow = ulaw
nat = no
[providertrunk0]
disallow = all
allow = ulaw
;allow = alaw
nat = no
secret =
nat = no
progressinband = yes
allow = ulaw
allow = alaw
nat = no
progressinband = yes
disallow = all
allow = ulaw
nat = no
progressinband = yes
更改后它将是
[general]
disallow = all
allow = ulaw
nat = no
[providertrunk0]
disallow = all
allow = ulaw
;allow = alaw
nat = no
secret =
allow = alaw
nat = no
progressinband = yes
allow = ulaw
allow = alaw
nat = no
progressinband = yes
disallow = all
allow = ulaw
allow = alaw
nat = no
progressinband = yes
我的尝试
我试图要排除[general]
和[providertrunk0]
部分的整个过程,但要'/general/,/providertrunk0/{next}'
像这样使用整个文件:
awk -v add="allow = alaw" '/general/,/providertrunk0/{next} /^nat = no$/&&lastLine!=add{print add}{lastLine=$0}1' sip.conf '
但它没有给出正确的输出。
$ cat tst.awk
BEGIN {
RS=""; ORS="\n\n"; FS=OFS="\n"
skip["[general]"]
skip["[providertrunk0]"]
add = "allow = alaw"
tgt = "nat = no"
}
!($1 in skip) {
for (i=1; i<NF; i++) {
if ( ($i != add) && ($(i+1) == tgt) ) {
$i = $i OFS add
}
}
}
{ print }
。
$ awk -f tst.awk file
[general]
disallow = all
allow = ulaw
nat = no
[providertrunk0]
disallow = all
allow = ulaw
;allow = alaw
nat = no
secret =
allow = alaw
nat = no
progressinband = yes
allow = ulaw
allow = alaw
nat = no
progressinband = yes
disallow = all
allow = ulaw
allow = alaw
nat = no
progressinband = yes
RS设置为空放的awk段模式(见RS = ""
在https://www.gnu.org/software/gawk/manual/gawk.html#Multiple-Line),所以你的输入被分成多行记录通过空行分开。设置ORS =“ \ n \ n”可确保在输出时记录之间留空行。将FS和OFS设置为“ \ n”意味着将记录分为多个字段。因此,剩下的代码就变得微不足道了,因为您可以将特定字段(行)与问题中提到的值进行比较。skip[]
只是我为要存储要在该数组中进行进一步处理而忽略的第一字段(第一行)字符串的任何数组组成的名称,然后针对每个记录测试记录的第一字段/行是否在其中数组,如果是,则跳过对其进行处理。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句