시작 패턴과 끝 패턴 사이의 줄을 찾는 방법은 무엇입니까? [복사]

시작 패턴과 끝 패턴 사이의 줄을 찾는 방법은 무엇입니까? [복사]

다음 내용이 포함된 파일이 있습니다.

zdk
aaa
b12
cdn
dke
kdn

입력 1: aaacdn

출력 1:

aaa
b12
cdn

입력 2: zdkdke

출력 2:

zdk
aaa
b12
cdn
dke

다음 명령을 사용하여 이를 달성할 수 있습니다.

grep -a aaa -A2 file # Output 1
grep -a aaa -A4 file # Output 2

하지만 파일에서 끝 문자열 패턴이 발생하는 위치(위치)를 정확히 알 수 없습니다(파일에는 20000줄이 있습니다).

이 목표를 어떻게 달성할 수 있나요?

답변1

grep여기서는 당신을 도울 수 없습니다. sed범위 표현식을 사용하면 이 작업을 더 잘 수행할 수 있습니다.

$ sed -n '/aaa/,/cdn/p' file
aaa
b12
cdn
$ sed -n '/zdk/,/dke/p' file
zdk
aaa
b12
cdn
dke

sed -n명시적으로 요청한 경우에만 행이 인쇄되도록 자동 인쇄를 억제합니다. /aaa/,/cdn/이는 범위가 발생할 때 발생합니다.

이러한 범위 표현식은 에서도 사용할 수 있습니다 awk. 다음과 같이 말할 수 있습니다.

awk '/zdk/,/dke/' file

sed -n '/^aaa$/,/^cdn$/p' file물론 이러한 모든 조건은 한 줄이 완전히 포함되어 있는지 확인 aaa하고 cdn다른 것은 포함되지 않는지 확인 하는 등 보다 제한적인 정규식으로 확장될 수 있습니다 .

답변2

이는 다음을 통해 수행할 수 있습니다.sed

sed -n '
    /^aaa$/,/^cdn$/w output1
    /^zdk$/,/^dke$/w output2
    ' file

답변3

이것은 grep명령입니다:

grep -o "aaa.*cdn" <(paste -sd_ file) | tr '_' '\n'

여러 줄 일치를 달성할 수 있지만 ( -OS X와 ​​같은 모든 플랫폼에서는 지원되지 않음) grepperl-regexp를 사용해야 합니다 . 따라서 해결 방법으로 새 ​​줄을 문자로 바꾼 다음 다시 변경합니다.grep-P_grep

아니면 당신은 사용할 수 있습니다pcregrep다중 라인 모드( -M)를 지원합니다.

또는 다음을 사용하십시오 ex.

ex +"/aaa/,/cdn/p" -scq! file

관련 정보