awkを使用して、ファイルの文字列の前に2行を追加します。

awkを使用して、ファイルの文字列の前に2行を追加します。

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$i1行を与えられ、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"

おすすめ記事