2行を追加したい
allow = alaw
allow = g729
文字列の前に
nat = no
ファイルsip.conf
(またはテキストベースのファイル)から。以前にallow = alaw
課がallow = g729
すでに存在していた場合は、nat = no
追加しないでください。このスクリプトは毎時間実行されます。そして、この行はファイルの[general]
直後と2つのセクションに追加しないでください[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
allow = g729
nat = no
progressinband = yes
期待される出力
[general]
disallow = all
allow = ulaw
nat = no
[providertrunk0]
disallow = all
allow = ulaw
;allow = alaw
nat = no
secret =
allow = alaw
allow = g729
nat = no
progressinband = yes
allow = ulaw
allow = alaw
allow = g729
nat = no
progressinband = yes
disallow = all
allow = ulaw
allow = alaw
allow = g729
nat = no
progressinband = yes
私の試み
cat addCodec.awk
BEGIN {
RS=""; ORS="\n\n"; FS=OFS="\n"
skip["[general]"]
skip["[providertrunk0]"]
addCodec = "allow = alaw\nallow = g729"
tgt = "nat = no"
}
!($1 in skip) {
for (i=1; i<NF; i++) {
if ( ($i != addCodec) && ($(i+1) == tgt) ) {
$i = $i OFS addCodec
}
}
}
{ print }
awk -f addCodec.awk sip.conf
このスクリプトは、両方の行が存在しない場合でも機能し、それを追加します。単一行がある場合は停止しました。条件を使用する必要がある場合はどうすればよいですか?
答え1
私は専門家ではありませんが、awk
(しかしpython
)$i
1行を与えられ、2行の文字列と比較します。"allow = alaw\nallow = g729"
これが問題です。各行を個別に確認する必要があります。
$(i-1)
$(i-2)
(最初)と(2番目)を別々に確認して比較する"allow = alaw"
コードを作成しました"allow = g729"
。この3つの状況に分けてみましょう。
FIRST - exist, SECOND - missed
FIRST - missed, SECOND - missed
FIRST - missed, SECOND - exist
または に$i
別の値を追加します。$(i-1)
BEGIN {
RS=""; ORS="\n\n"; FS=OFS="\n"
skip["[general]"]
skip["[providertrunk0]"]
addCodec1 = "allow = alaw"
addCodec2 = "allow = g729"
tgt = "nat = no"
}
!($1 in skip) {
for (i=1; i<NF; i++) {
if ($(i) == tgt) {
# FIRST - exist, SECOND - missed
if ( ($(i-1) == addCodec1) ) {
$i = addCodec2 OFS $i
}
# FIRST - missed, SECOND - missed
else if ( ($(i-1) != addCodec1) && ($(i-1) != addCodec2) ) {
$i = addCodec1 OFS addCodec2 OFS $i
}
# FIRST - missed, SECOND - exist
else if ( ($(i-2) != addCodec1) && ($(i-1) == addCodec2) ) {
$(i-1) = addCodec1 OFS $(i-1)
}
}
}
}
{ print }
ところで:より高速で簡単にするために、別のパラメータを使用して2回実行します。
最初のものは"allow = g729"
前にのみ配置され、"nat = no"
2番目は"allow = alaw"
前にのみ配置されます"allow = g729"
。
"third line"
これにより、前に入れるためにやり直すことができ、以前に入れるためにやり直す"allow = alaw"
ことができます。"fourth line"
"third line"
答え2
既存の試みを修正してください。さまざまな考えられるシナリオを見る複雑さは、ユーザー定義関数fx()にカプセル化されています。見つかったtgt行のインデックスに応じて、さまざまなシナリオが描画されます。
$ cat addCodec.txt
BEGIN {
RS=""; ORS="\n\n"; FS=OFS="\n"
skip["[general]"]
skip["[providertrunk0]"]
e1 = "allow = alaw"
e2 = "allow = g729"
a[e2] = a[e1] = 1
addCodec = e1 OFS e2
tgt = "nat = no"
}
!($1 in skip) {
for (i=1; i<=NF; i++) {
if ($i "" == tgt) {
fx(i)
break
}
}
}
{ print }
function fx(i, cond) {
cond = (i>2 ? (a[$(i-2)]+0) : 0) "" (i>1 ? (a[$(i-1)]+0) : 0)
if ( cond "" == "11" ) { $(i-2) = e1; $(i-1) = e2 }
else if ( cond "" == "01" ) { $(i-1) = addCodec }
else if ( cond ~ /0$/ ) { $(i) = addCodec OFS $(i) }
}
$ awk -f addCodec.txt file