빈 줄로 구분된 첫 번째 "단락" 또는 "섹션"만 반환하는 항목으로 파이프를 시도하고 있습니다. 다른 답변에 따라 범위를 사용 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
두 번째 레코드를 인쇄하는 것은 다음과 같이 명백하게 변경된 것입니다 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/
경계선을 포함하여 해당 정규식과 일치하는 줄을 가져옵니다. Begin은 인쇄를 켜고 End는 끕니다. 빈 줄 바로 뒤의 줄이 인쇄를 다시 켭니다.Package:
그 안에도 포함되어 있기 때문입니다.
나는 to를 사용 sed
하고 변경할 수 있다는 것을 깨달았으며 처음부터 시작될 것입니다. 시작이 하나뿐이므로 한 번만 일치합니다./begin/
0
$ cat txt |sed -n '0,/^$/p'
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.9.1-0ubuntu0.1
Supported: 3y