두 줄을 추가하고 싶어요
allow = alaw
allow = g729
문자열 앞에
nat = no
파일 sip.conf
(또는 텍스트 기반 파일)에서. 이전에 allow = alaw
과 가 allow = g729
이미 존재 했다면 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
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
한 줄을 주어진 다음 두 줄이 있는 문자열과 비교합니다. "allow = alaw\nallow = g729"
이것이 문제입니다. 각 줄을 개별적으로 확인해야 합니다.
$(i-1)
$(i-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 }
그런데:덜 빠르고 간단하게 만들기 위해 다른 매개변수를 사용하여 두 번 실행하겠습니다.
첫 번째 것은 "allow = g729"
앞에만 배치되고 "nat = no"
두 번째는 "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