awk를 사용하여 패턴 일치 후 다음 레코드를 바꾸는 방법

awk를 사용하여 패턴 일치 후 다음 레코드를 바꾸는 방법

패턴 매칭 후 다음 레코드를 교체(또는 수정)하는 방법은 무엇입니까? 전임자:

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이 아님)이면 행이 교체되고 f0으로 재설정됩니다.

  • /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에서도 작동하는 것으로 보이지만 맨 위에 있는 한 줄의 코드는 명령 오류로 인해 이러한 구현에서는 작동하지 않는 것 같습니다.sedc

답변3

$ awk '/blah/ {print $0 "\n" "replacement"; getline; next} 1' file

현재 줄이 일치하면 blah인쇄하고 replacement새 줄에 인쇄하고 다음 출력 줄("replace"로 대체)을 가져옵니다.아무것도 하지 마세요을 선택한 다음 나머지 규칙을 건너뜁니다. "나머지 규칙"(일치하지 않는 행 및 일치하지 않는 행에만 적용 blah)따르다라인이 어쩌구와 일치합니다) 단순히 라인을 인쇄합니다.

관련 정보