첫 번째 일치 패턴까지 행 범위 가져오기

첫 번째 일치 패턴까지 행 범위 가져오기

다음과 같은 파일이 있습니다.

line1
line2
line3
line4
line5
line6
line7
line5
line2

line1와 사이의 데이터를 가져오고 싶습니다 line5. 나는 그것을 사용했다 awk '/line1/,/line5/' myfile. 예상되는 출력은 다음과 같습니다.

line1
line2
line3
line4
line5

그러나 awk는 마지막 경기까지 읽습니다 line5. 나는 awk가 마지막 경기가 아닌 첫 번째 경기에서 멈추기를 원합니다.

답변1

문제를 재현할 수 없습니다. awk *는 내가 예상한 대로 수행합니다. 첫 번째 발생 사이에서 line1첫 번째 발생까지 모든 줄을 인쇄합니다 line5.

$ awk '/line1/,/line5/' file
line1
line2
line3
line4
line5

line5파일의 다섯 번째 줄에 있는 문자열에 인쇄되지 않는 숨겨진 문자가 있습니까? 이것이 awk일치하지 않는 이유를 설명합니다 .


해당 명령을 실행하여 다시 확인할 수 있습니다 sed.

$ sed -n '/line1/,/line5/p' file
line1
line2
line3
line4
line5

모든 행을 인쇄하지 않음(기본 동작)을 나타내지만 의 첫 번째 발생부터 첫 번째 발생까지의 -n모든 행을 인쇄하도록 지시합니다.sed/line1/,/line5/pline1line5


그냥 인쇄하고 싶다면첫 번째패턴과 일치하는 줄로 시작 line1하고 일치하는 줄로 끝나는 줄 집합을 만들려면 line5다음을 사용할 수 있습니다.

sed -n '/line1/,$p;/line5/q' file

*gawk GNU 구현을 사용하여 확인했습니다 (Kusalananda는 이것이 awkOpenBSD에서도 awk올바른 mawk일을 한다는 것을 확인했습니다).

답변2

다음을 사용할 수 있습니다 awk.

awk '/line1/{prnt=1} prnt{print} /line5/{exit}' infile

line1다음 첫 번째 줄이 일치할 때까지 일치하는 줄을 인쇄한 다음 line5즉시 종료합니다.

답변3

awk '/foo/,/bar/'

인쇄모두foo일치하는 줄로 시작하고 다음 일치하는 줄(또는 동등한 줄의 반대쪽과 동일한 줄)로 sed끝나는 파일 부분 bar입니다(정규식은 line1include를 포함하는 줄과도 일치합니다).line1anythingline10

어울리고 싶다면첫 번째line1일치하는 줄로 시작 하고 다음 일치하는 줄(또는 같은 줄)로 끝나는 섹션의 경우 다음을 line5수행할 수 있습니다.

sed '/line1/,$!d;/line5/q' < file

line5(첫 번째 일치하는 줄 뒤에 일치하는 줄이 없으면 해당 줄부터 파일 끝까지 line1인쇄됩니다 . 또한 패턴은 다음과 같습니다.line1sed기초적인정규 표현식이지만 awk이는 확장 표현식입니다).

관련 정보