두 패턴 중에서 첫 번째 항목을 선택하는 방법


27

패턴을 포함하여 두 패턴 중에서 첫 번째 항목을 선택하려면 어떻게해야합니까? 바람직하게 사용 sed하거나 awk.

나는 가지고있다:

text
something P1 something
content1
content2
something P2 something
text
something P1 something
content3
content4
something P2 something
text

P1과 P2 사이의 첫 번째 줄 (P1 줄과 P2 줄 포함)을 원합니다.

something P1 something
content1
content2
something P2 something

답변:


22
sed '/P1/,/P2/!d;/P2/q'

... 범위 내에 속하지 않는 d모든 줄 !q삭제 한 다음 범위 끝을 처음 접했을 때 작업을 생략 하여 작업 을 수행 할 수 있습니다. P1이 P1 앞에 오더라도 실패하지 않으며 간단하게 작성하기 위해 GNU 특정 구문이 필요하지 않습니다.


우수한! 내 것보다 훨씬 낫다.
muru

1
@muru-자동 인쇄를 대상으로하면 왜곡을 피하는 것이 더 쉬운 경우가 많습니다. 그것이 내가 어쨌든 빠진 습관입니다. 나는 그것이 프룬선택 방법 으로 가장 잘 묘사 될 것이라고 생각합니다 . 패턴을 찾지 않고 부정하는 경향이 있습니다.
mikeserv

거대한 fileSize를 처리 할 때 중단됩니다.
Brain90

@ Brain90-해서는 안됩니다. 불만 사항을 확실하게 재현 할 수 있다면 관리자에게 문제를 해결해야합니다 . 위의 스크립트가 아닌 실행중인 sed버그입니다 sed.
mikeserv

1
@ mikeserv 내가하지 않았다면 말하지 않았을 것입니다. 내가 두 캐릭터에 관심이 있는지 아닌지에 대한 당신의 걱정은 이상 /P2/q합니다. 그게 다야. 뭔가 궁금해서 내가 찾은 것을 나누고 싶었습니다.
Alexej Magura

8

awk

awk '/P1/{a=1};a;/P2/{exit}' file
something P1 something
content1
content2
something P2 something

8

에서 sed:

sed -n '/P1/,/P2/p; /P2/q'
  • -n기본 인쇄를 억제하고 p명령을 사용하여 일치하는 주소 범위 사이의 행을 인쇄합니다 .
  • 일반적으로 이것은 두 섹션과 모두 일치하므로 q처음 P2일치 하면 ( ) 를 종료 합니다.

P2앞에 오는 경우 실패합니다 P1. 이 경우를 처리하려면 다음을 시도하십시오.

sed -n '/P1/,/P2/{p; /P2/q}'

1
동의하지 않습니다. mikeserv의 대답은 당신보다 낫지 않습니다.
G-Man, 'Reinstate

@ g-man-pshaw. 그러나 나는 단지 같은 것을 생각하고 있었다.
mikeserv

1
@gman-아뇨. 이제 알겠다. 광산은 더 나아졌다. 아니 {스택}!
mikeserv

1

패턴 자체를 건너 뛰려면 다음 awk버전이 있습니다.

awk '/P2/ {exit} /P1/ {f=1; next} f' file

나를 위해 작동합니다. 명령 작동 방식에 대한 추가 정보를 추가 할 수 있습니까?
0xAffe

1

더 간단한 awk해결책 ( iruvar의 답변 과  muru의 답변 사이의 중간 정도 이지만 변수를 사용하지 않음) :

awk '/P1/,/P2/ { print }  /P2/ { exit }'

muru가 지적했듯이 첫 번째 P2가 첫 번째 P1 앞에 나타나면 아무 것도 인쇄하지 않습니다.

물론 모든 P1-P2 범위를 인쇄하려는 경우 :

something P1 something
content1
content2
something P2 something
something P1 something
content3
content4
something P2 something

그냥 그 exit부분을 남겨주세요 :

awk '/P1/,/P2/ { print }'

1
awk '/P1/,/P2/{print;f=1} f&&/P2/{exit}' data

인쇄하지 않고 인쇄 직후에 종료합니다.


0

패턴 자체를 건너 뛰고 단일 GNU sed에서 첫 번째 일치하는 블록 만 표시하려면 다음을 수행하십시오.

sed -nre '/STARTPATTERN/ {:a;n;/ENDPATTERN/{b;};p;ba}' file
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.