패턴 매칭 후 다음 레코드를 교체(또는 수정)하는 방법은 무엇입니까? 전임자:
1
2
3 blah
4 replace this record
5 blah
6 replace this record
7
8
9
여기서는 이전 레코드가 "어쩌고"일 때 네 번째와 여섯 번째 레코드를 건너뛰거나 교체하고 싶습니다.
답변1
이는 다음 행을 대체합니다 blah
.
$ awk 'f{$0="replacement"; f=0} /blah/{f=1} 1' file
1
2
3 blah
replacement
5 blah
replacement
7
8
9
어떻게 작동하나요?
f{$0="replacement"; f=0}
true
f
(0이 아님)이면 행이 교체되고f
0으로 재설정됩니다./blah/{f=1}
이 줄이 정규식과 일치하면 true로
blah
설정됩니다 .f
1
이것은 awk의 전체 줄 인쇄에 대한 비밀스러운 약어입니다.
답변2
sed
대신 GNU를 사용하세요 awk
:
sed -e '/blah/{ n; c\' -e 'replacement' -e '}' file
패턴과 일치하는 행을 찾습니다 blah
. 그러한 줄이 발견되면 인쇄 n
되고 다음 입력 줄도 즉시 읽습니다. 그러면 다음 줄이 c
대체 텍스트로 변경됩니다. 대체 텍스트는 루프 끝에 인쇄됩니다.
주석이 달린 sed
스크립트:
/blah/ { ;# this is a "blah" line
n ;# output line and read next line
# change the line just read
c\
replacement
}
# (implicitly print all lines)
sed
이 스크립트는 OpenBSD 및 NetBSD에서도 작동하는 것으로 보이지만 맨 위에 있는 한 줄의 코드는 명령 오류로 인해 이러한 구현에서는 작동하지 않는 것 같습니다.sed
c
답변3
$ awk '/blah/ {print $0 "\n" "replacement"; getline; next} 1' file
현재 줄이 일치하면 blah
인쇄하고 replacement
새 줄에 인쇄하고 다음 출력 줄("replace"로 대체)을 가져옵니다.아무것도 하지 마세요을 선택한 다음 나머지 규칙을 건너뜁니다. "나머지 규칙"(일치하지 않는 행 및 일치하지 않는 행에만 적용 blah
)따르다라인이 어쩌구와 일치합니다) 단순히 라인을 인쇄합니다.