빈 줄로 구분된 첫 번째 "단락" 또는 "섹션"의 내용만 반환하도록 입력을 파이프하려고 합니다. 다른 답변 중 일부를 기반으로 범위를 사용 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==1
to 의 명백한 변형 입니다 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