범위 내에서 일치하는 텍스트가 있는 줄을 인쇄해 보세요. --START-- 및 --END--를 범위 모드로 사용하면 제대로 작동합니다.
$ sed -n '/--START--/{:a;N;/--END--/!ba; /Device=A/p}' file
--START--
Device=A
Data=asdfasdf
Lorem=Ipsum
--END--
--START--
Device=A
Data=asdfasdf
--END--
하지만 --END--를 빈 줄로 바꾸면 작동이 중지됩니다.
file:
--START--
Device=A
Data=asdfasdf
Lorem=Ipsum
--START--
Device=A
Data=asdfasdf
$ sed -n '/--START--/{:a;N;/^$/!ba; /Device=A/p}' file
sed가 중괄호 안의 빈 줄 패턴을 인식하지 못하는 것 같습니다. --END-- 대신 빈 줄 모드를 사용하도록 명령을 수정하는 방법을 알려주십시오.
답변1
여기서 문제는 중괄호 하위 표현식에 있는지 여부에 관계없이 /pattern/
전체 패턴 공간과 일치한다는 것입니다. 여러 줄 패턴이 있으면( N
예: 를 사용하여) 일치하는 것이 불가능합니다( ^$
및 사이에 하나 이상의 개행 문자 사용).^
$
GNU sed에는중간 사이즈울트라라인 모드 확장
^ 및 $가 각각 개행 뒤의 빈 문자열 및 개행 앞의 빈 문자열과 일치하도록 합니다(일반적인 동작 외에도).
$ sed -n '/--START--/{:a;N;/^$/M!ba; /Device=A/p}' file
--START--
Device=A
Data=asdfasdf
Lorem=Ipsum
그렇지 않고 여러 줄 패턴에서 뒤에 오는 빈 줄을 일치시키려면 \n$
명시적으로 ex를 사용할 수 있어야 합니다.
$ sed -n '/--START--/{:a;N;/\n$/!ba; /Device=A/p}' file
--START--
Device=A
Data=asdfasdf
Lorem=Ipsum