awk는 고정 텍스트부터 시작하여 첫 번째 빈 줄까지

awk는 고정 텍스트부터 시작하여 첫 번째 빈 줄까지

빈 줄로 구분된 첫 번째 "단락" 또는 "섹션"의 내용만 반환하도록 입력을 파이프하려고 합니다. 다른 답변 중 일부를 기반으로 범위를 사용 awk하거나 얻을 수 있다고 생각했지만 sed작동하지 않는 것 같습니다.

$ cat txt
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.9.1-0ubuntu0.1
Supported: 3y

Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.4-0ubuntu1
Supported: 3y

$ cat txt |awk '/^Package:/,/^$/'
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.9.1-0ubuntu0.1
Supported: 3y

Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.4-0ubuntu1
Supported: 3y

첫 번째 "부분"만 반환하면 안 되나요? (에 따르면: 고정 텍스트에서 시작하여 첫 번째 빈 줄까지 Grep 그리고 https://www.unix.com/shell-programming-and-scripting/148692-awk-script-match-pattern-till-blank-line.html)

  • 빈 줄을 사용하면 grep -ve ^$제거되므로 특수 문자가 없습니다.
  • 다른 부분을 추출하려고 하면 두 개의 "섹션"에서 이러한 부분을 얻습니다.

    $ cat txt |awk '/^Package:/,/^Version:/'
    Package: plasma-desktop
    Architecture: amd64
    Version: 4:5.12.9.1-0ubuntu0.1
    Package: plasma-desktop
    Architecture: amd64
    Version: 4:5.12.4-0ubuntu1
    
  • sed -n '/^Package:/,/^$/p'또는를 사용하면 sed -n '/^Package:/,/^Version:/p'동등한 awk와 동일한 결과를 얻습니다.

처음 나타난 후 어떻게 awk받거나 중지합니까 sed?

답변1

이것이 awk에 단락 모드가 있는 이유입니다.

$ awk -v RS= 'NR==1' file
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.9.1-0ubuntu0.1
Supported: 3y

두 번째 레코드를 인쇄하는 것은 NR==1to 의 명백한 변형 입니다 NR==2.

$ awk -v RS= 'NR==2' file
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.4-0ubuntu1
Supported: 3y

그건 그렇고, 범위 표현식을 사용하지 마십시오. 플래그를 사용하는 것보다 약간 더 간단하게 코드의 사소한 문제를 해결할 수 있지만, 요구 사항이 조금이라도 변경되면 조건문을 완전히 다시 작성하거나 복제해야 합니다. 따라서 /begin/,/end/sed 또는 awk와 함께 사용 하고 싶을 때마다 /begin/{f=1} f{print} /end/{f=0}awk를 대신 사용하여 시작/끝 줄 등을 인쇄하는 시기/방법을 더 잘 제어할 수 있습니다.

답변2

에서는 /begin/,/end/일치 항목이 발견될 때마다 "작업 플래그"가 켜지고 /begin/일치 항목이 발견되면 꺼집니다. /end/또한 "시작" 및 "끝"이 있는 경계선을 인쇄합니다.

입력 결과는 다음과 같습니다(다음 예에서는 인쇄 줄 뒤에 주석이 옵니다).

  • 그리고 '/^Package:/,/^$/':
    Package: plasma-desktop        #TURN ON
    Architecture: amd64            #
    Version: 4:5.12.9.1-0ubuntu0.1 #
    Supported: 3y                  #
                                   #TURN OFF
    Package: plasma-desktop        #TURN ON
    Architecture: amd64            #
    Version: 4:5.12.4-0ubuntu1     #
    Supported: 3y                  #
  • 그리고 '/^Package:/,/^Version:/':
    Package: plasma-desktop        #TURN ON
    Architecture: amd64            #
    Version: 4:5.12.9.1-0ubuntu0.1 #TURN OFF
    Supported: 3y

    Package: plasma-desktop        #TURN ON
    Architecture: amd64            #
    Version: 4:5.12.4-0ubuntu1     #TURN OFF
    Supported: 3y

"Package:"로 시작하는 단락만 인쇄하려면 다음과 같이 작성할 수 있습니다.

sed -ne '/^$/q' -e '/^Package:/,$p' file

sed빈 줄이 발견되자마자 파일 처리가 종료됩니다 /^$/q.

그리고 awk:

awk '/^$/{exit};/^Package:/,0' file

답변3

해설자로서콰지모도

/begin/,/end/경계선을 포함하여 이러한 정규식과 일치하는 줄을 가져옵니다. start는 인쇄를 켜고, end는 끕니다. 빈 줄 다음 줄은 인쇄를 다시 시작합니다 Package:.

나는 사용하고 변경할 수 있으며 sed처음 부터 시작될 것이라는 것을 깨달았습니다. 시작이 하나뿐이므로 한 번만 일치합니다./begin/0

$ cat txt |sed -n '0,/^$/p'
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.9.1-0ubuntu0.1
Supported: 3y

관련 정보