일치하는 두 패턴 사이의 파일 행을 인쇄합니다.

일치하는 두 패턴 사이의 파일 행을 인쇄합니다.

두 줄 사이의 모든 줄을 인쇄하는 방법, 첫 번째 줄은 한 패턴으로 시작하고 마지막 줄은 다른 패턴으로 끝나나요?


고쳐 쓰다
이 문서가 HTML인 것은 실수라는 점을 말씀드리고 싶습니다. 신경이 곤두선 것 같으니 잊어버리세요. HTML을 구문 분석하거나 텍스트 문서의 일부를 인쇄하는 것 이외의 작업을 수행하고 싶지 않습니다.


다음 예를 고려하십시오.

aaa
bbb
pattern1
aaa pattern2
bbb
ccc
pattern2
ddd
eee
pattern1
fff
ggg

pattern1이제 한 줄의 시작 부분 부터 시작하여 다른 줄의 시작 부분부터 시작하는 pattern2첫 번째 인스턴스 사이의 모든 내용을 인쇄하고 싶습니다 . 나는 출력에 and 줄을 갖고 싶지만 pattern1그 줄 뒤에는 아무것도 원하지 않습니다.pattern2pattern2

pattern2이 섹션의 줄 중 하나에서 찾을 수 있습니다. 여기서 멈추고 싶지는 않지만 이 문제는 지침으로 줄을 시작하면 쉽게 해결할 수 있습니다 ^.

pattern1나중에 또 한 줄이 나오긴 하는데 pattern2전혀 보고 싶지 않네요. 난 그냥 그 사이의 모든 것을 찾고 있어요첫 번째인스턴스 pattern1와 첫 번째 인스턴스를 pattern2포함합니다.

내가 찾은무엇이것은 다음을 사용하여 거의 거기에 도달했습니다 sed.

sed -n '/^pattern1/,/^pattern2/p' inputfile.txt

...하지만 다음 인스턴스에서 다시 인쇄를 시작합니다.pattern1

grep -n ... | cut -f1 -d:두 번 사용하여 두 줄 번호를 모두 얻고 tail원하는 부분을 얻는 방법을 생각할 수 있지만 head더 깔끔한 방법이 있기를 바랍니다. awk이 작업을 위한 더 나은 도구가 있을까요 ?

작동하게 되면 고리에 묶어두기를 원합니다 git. 저도 어떻게 하는지는 모르겠지만 계속해서 읽고 검색하고 있어요 :)

감사해요.

답변1

을 사용하여 sed패턴을 종료 할 수 sed '/pattern/q'있으므로 일치만 하고 두 번째 패턴 일치에서 종료하면 됩니다.

sed -n '/^pattern1/,/^pattern2/{p;/^pattern2/q}'

첫 번째 블록만 표시됩니다. 하위 명령을 사용하면 일치 후에만 종료할 수 ^pattern2있습니다 . 이 두 일치 항목을 결합할 수 있습니다.sed^pattern1^pattern2

sed -n '/^pattern1/,${p;/^pattern2/q}'

답변2

일반적인 접근 방식으로 다음 sed을 사용하여 한 일치 항목에서 다른 일치 항목(포함)으로 쉽게 인쇄할 수 있습니다.

$ seq 1 100 > test
$ sed -n '/^12$/,/^15$/p' test
12
13
14
15

awk를 사용하면 다음과 같은 작업을 수행할 수 있습니다.

$ awk '/^12$/{flag=1}/^15$/{print;flag=0}flag' test
12
13
14
15

다음과 같이 이를 포함하지 않도록 만들 수 있습니다.

$ awk '/^12$/{flag=1;next}/^15$/{flag=0}flag' test
13
14

$ sed -n '/^12$/,/^15$/p' test | sed '1d;$d'
13
14

관련 정보