반복되는 텍스트 블록(100개 이상의 블록)이 포함된 파일이 있습니다. 각 반복 블록에는 동일한 수의 행이 있으며 모든 블록에서 AB_*를 바꾸고 싶습니다 NodeNames, N1 N2 N3 N4 N5
. NodeNames, N1 N2 N3 N4
(*특정 AB 블록의 특정 ID를 나타냅니다.)
이 파일의 형식은 다음과 같습니다.
DeviceName, AB_12445
line 2
<empty line)
line 3
line 4
line 5
empty line
line 6
line 7
empty line
NodeNames, N1 N2 N3 N4 N5
line 9
DeviceName, AB_0483
..
..
..
NodeNames, N1 N2 N3 N4 N5
line 9
특정 AB 블록(예: AB_0483)에 대해 원하는 출력은 다음과 같습니다.
DeviceName, AB_0483
..
..
..
NodeNames, N1 N2 N3 N4
line 9
업데이트된 청크와 영향을 받지 않은 청크가 포함된 전체 출력을 새 파일에 저장하고 싶습니다.
답변1
의견을 바탕으로 명령을 업데이트했습니다.
awk '/AB_/{a=1}!a{print;next}a{if($0!~/NodeNames/){print}else{a=0;printf("NodeNames, N1 N2 N3 N4\n")}}' input > output
답변2
StackExchange에 오신 것을 환영합니다. 나는 이것이 그것을 커버한다고 믿는다. 기본적으로 우리가 영향을 받는 블록에 있는지 여부를 나타내기 위해 플래그 변수 "ab"를 설정합니다. 그런 다음 "ab" 블록 내부에 있는 경우 필요에 따라 문제가 되는 NodeNames 행을 교체합니다.
원하는 것을 달성하는 다른 방법은 많이 있습니다. 제가 제시한 예제 답변은 다소 길고 장황합니다. 다른 사람이 곧 영리하고 비밀스러운 농담을 제안할 것으로 기대하세요.
$ cat foo.awk
{
if($1=="DeviceName," && $2 ~ /^AB/) { ab=1 }
if($1=="DeviceName," && $2 !~ /^AB/) { ab=0 }
if($0=="NodeNames, N1 N2 N3 N4 N5" && ab==1) {
$0="NodeNames, N1 N2 N3 N4"
}
print $0
}
사용 예:
awk -f foo.awk myfile
답변3
해결책 은 다음과 같습니다 sed
.
sed '/DeviceName, *AB_12445/, /DeviceName, *AB_/ { /NodeNames/s/ N5// }'