여러 줄의 grep 또는 sed

여러 줄의 grep 또는 sed

여러 섹션이 포함된 매우 큰 텍스트 파일이 있습니다. 이러한 섹션에는 섹션 제목이 포함됩니다. 섹션 헤더를 추출하고 grep 또는 sed를 사용하여 인쇄하고 싶습니다. 파일은 다음과 같습니다.

=========
Section Header
=========
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Mauris pellentesque pulvinar pellentesque habitant. A iaculis at erat pellentesque. Libero justo laoreet sit amet cursus. Blandit aliquam etiam erat velit scelerisque in dictum non. Cras tincidunt lobortis feugiat vivamus at. Elit ut aliquam purus sit amet luctus venenatis lectus. Et magnis dis parturient montes nascetur ridiculus mus mauris. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Urna id volutpat lacus laoreet non curabitur gravida arcu. Imperdiet proin fermentum leo vel orci porta. Vel risus commodo viverra maecenas accumsan. Diam ut venenatis tellus in. Ultrices dui sapien eget mi. Vivamus arcu felis bibendum ut. Nam aliquam sem et tortor consequat id porta nibh venenatis.

==========
Another Section
==========
Dictum at tempor commodo ullamcorper. Adipiscing elit pellentesque habitant morbi tristique senectus et. Malesuada pellentesque elit eget gravida cum sociis natoque. Venenatis tellus in metus vulputate eu. Eget aliquet nibh praesent tristique magna sit amet purus. Arcu non odio euismod lacinia at quis risus sed. Cursus eget nunc scelerisque viverra. Habitant morbi tristique senectus et netus et malesuada. Dolor sed viverra ipsum nunc. Magna eget est lorem ipsum dolor sit amet consectetur. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Nulla malesuada pellentesque elit eget gravida cum. Rhoncus est pellentesque elit ullamcorper dignissim cras.

헤더 매체의 수는 다를 수 있습니다. 각 섹션 헤더를 별도의 줄에 인쇄하고 싶습니다. 등호를 제거하려면 후시를 사용하는 것이 가장 좋습니다.

답변1

또한 시도

$ sed -n '/=\+/ {n;p;n;}' file
Section Header
Another Section

하나 이상의 줄에서 =다음 줄을 가져와 인쇄한 후 다음 줄을 가져옵니다(잊었습니다).

답변2

헤더가 한 줄이든 여러 줄이든 모든 Unix 시스템의 모든 쉘에서 강력하게 awk를 사용할 수 있습니다.

$ awk '/^=+$/{f=!f; next} f' file
Section Header
Another Section

^={9,}$모든 등호를 포함하지만 헤더 부분을 나타내지 않는 다른 줄이 있는 것처럼 정규식을 사용하십시오 .

답변3

의 명령은 sed행 번호, 정규식 또는 이 둘의 조합일 수 있는 범위로 주소를 지정할 수 있습니다.

범위는 태그 /^==*$/,/^==*$/로 둘러싸인 헤더 행과 일치합니다 ====. 정규식은 ^==*$"하나 이상의 =문자를 포함하지만 다른 문자는 포함하지 않는 줄"로 이해될 수 있습니다. 즉, 다음은 헤더 태그 줄을 포함하여 모든 헤더를 인쇄합니다.

sed -n '/^==*$/,/^==*$/ p' file

헤더 태그 라인 인쇄를 방지하려면 p헤더 태그 중 하나가 아닌 라인만 호출하십시오.

sed -n '/^==*$/,/^==*$/ { // !p; }' file

빈 정규 표현식은 가장 최근에 사용한 정규 표현식을 재사용하고 표현식이 사용될 때 !호출되도록 보장합니다.p아니요성냥.

귀하의 질문에 텍스트가 주어지면 결과는 다음과 같습니다.

Section Header
Another Section

이는 여러 줄 헤더에도 적용됩니다.

$ cat file
====
Title: Hello world
Author: Me
====

Text goes here

====
That was it
The end
====
$ sed -n '/^==*$/,/^==*$/ { // !p; }' file
Title: Hello world
Author: Me
That was it
The end

관련 정보