두 줄 사이의 모든 줄을 인쇄하는 방법, 첫 번째 줄은 한 패턴으로 시작하고 마지막 줄은 다른 패턴으로 끝나나요?
고쳐 쓰다
이 문서가 HTML인 것은 실수라는 점을 말씀드리고 싶습니다. 신경이 곤두선 것 같으니 잊어버리세요. HTML을 구문 분석하거나 텍스트 문서의 일부를 인쇄하는 것 이외의 작업을 수행하고 싶지 않습니다.
다음 예를 고려하십시오.
aaa
bbb
pattern1
aaa pattern2
bbb
ccc
pattern2
ddd
eee
pattern1
fff
ggg
pattern1
이제 한 줄의 시작 부분 부터 시작하여 다른 줄의 시작 부분부터 시작하는 pattern2
첫 번째 인스턴스 사이의 모든 내용을 인쇄하고 싶습니다 . 나는 출력에 and 줄을 갖고 싶지만 pattern1
그 줄 뒤에는 아무것도 원하지 않습니다.pattern2
pattern2
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