종료 표현식이 존재하는 경우 두 표현식 사이에 텍스트를 인쇄합니다(sed -n).

종료 표현식이 존재하는 경우 두 표현식 사이에 텍스트를 인쇄합니다(sed -n).

그래서 파일의 두 표현식 사이에 있는 모든 텍스트를 표시하고 싶습니다.

문서

ddd
eee
aaa
vvv
bbb
nnn
cdn
dds
aaa
xxx
xxx
xxx

따라서 다음 명령을 사용하십시오

cat $file |sed -n "/aaa/,/cdn/p"

알겠어요

aaa
vvv
bbb
nnn
cdn
aaa
xxx
xxx
xxx

어느 것이 맞습니까?

그러나 나는 시작 표현식과 끝 표현식 "사이"에 있는 텍스트만 원합니다. 그래서 닫는 표현 없이 텍스트를 표시하고 싶지 않습니다...

그래서 저는 이 결과를 얻을 수 있는 방법을 찾고 있습니다.

aaa
vvv
bbb
nnn
cdn

답변1

$ sed -n '/aaa/,/cdn/ { /aaa/h; //!H; /cdn/ { g; p; }; }' file
aaa
vvv
bbb
nnn
cdn

이는 시도 중인 명령과 동일한 범위를 사용하지만 해당 범위 내에서 일치하면 예약된 공간에 줄을 저장하고, aaa일치하지 않으면 예약된 공간에 줄을 추가한 aaa다음 예약된 공간을 가져와 인쇄합니다. 일치하는 경우 cdn.

aaa이렇게 하면 파일에서 둘 중 하나(또는 둘 다)가 반복되는 "가장 좁은" 영역이 추출됩니다. 즉 , 다음과 같은 입력을 의미합니다.cdnaaacdn

111
111
aaa
222
222
aaa
333
333
cdn
444
444
cdn

당신에게 줄 것이다

aaa
333
333
cdn

...대신에첫 번째 aaa도착하다마지막 cdn.


다음을 사용하지 않고 동일한 내용을 표현하는 또 다른 방법 -n:

sed -e '/aaa/,/cdn/!d' -e '/aaa/h' -e '//!H' -e '/cdn/!d' -e g file

답변2

그리고, 이것은 아니다이지만 다음보다 더 읽기 쉽습니다 sed.

perl -0nE 'say $& if /\baaa\b.*?\bcdn\b/s' file
aaa
vvv
bbb
nnn

그리고:

grep -Pzo '(?s)\baaa\b.*?\bcdn\b' file
aaa
vvv
bbb
nnn

확인하다grep -Pzo

관련 정보