sed - 줄이 ^ 조건과 일치하면 패턴 범위와 일치하는 줄을 인쇄합니다.

sed - 줄이 ^ 조건과 일치하면 패턴 범위와 일치하는 줄을 인쇄합니다.

이 질문을 찾아서 내 문제의 99%를 해결했지만 끝 패턴을 ^. sed - 행이 조건과 일치하면 패턴 범위와 일치하는 행을 인쇄합니다.

이것은 내 데이터이며 줄 시작 부분에서 닫는 괄호를 일치시켜야 합니다.


(
Device=B
Data=asdfasdf(qwfw)
Lorem=Ipsum
)
(
Device=A
Data=asdfasdf(aewf)
Lorem=Ipsum
)
(
Device=B
Data=asdfasdf(wef)
)
(
Device=A
Data=asdfasdf(jalks)
)
(
Device=B
Data=asdfasdf(asf)
)
(
Device=C
Data=asdfasdf(asfew)
Lorem=Ipsum
)

이 명령을 시도 중이지만 아무것도 일치하지 않습니다.

sed -n '/(/{:a;N;/^)/!ba;/Device=A/p}' file

삭제하면 ^다음이 반환됩니다.

-> % sed -n '/(/{:a;N;/)/!ba;/Device=A/p}'  test 
(
Device=A
Data=asdfasdf(aewf)
(
Device=A
Data=asdfasdf(jalks)

내가 여기서 무엇을 놓치고 있는지 아는 사람 있나요?

sed 버전

sed (GNU sed) 4.5
Copyright (C) 2018 Free Software Foundation, Inc.

답변1

^ 패턴 공간에 줄을 누적하면 더 이상 다음 줄의 시작 부분을 일치시키는 데 를 사용할 수 없지만 대신 \n(삽입된 개행 문자)를 사용해야 합니다.

sed -n '/(/{:a;N;/\n)/!ba; /Device=A/p}' infile

나는 그것을 매우 좋아하지만코스타스의 솔루션거기에(보통 홀딩 버퍼를 사용하는 것이 더 쉽고/더 좋습니다):

sed 'H;/^(/h;/^)/!d;x;/Device=A/!d' infile

이 경우 ^두 모드 모두 앵커 포인트가 필요합니다.

답변2

sed로 이 작업을 수행하려고 하면 awk가 반세기 전에 발명되었을 때 쓸모없던 신비한 구조를 사용하게 됩니다. GNU awk를 사용하여 다중 문자 RS 및 RT를 구현합니다.

$ awk -v RS='\n)\n' '/Device=A/{ORS=RT; print}' file
(
Device=A
Data=asdfasdf(aewf)
Lorem=Ipsum
)
(
Device=A
Data=asdfasdf(jalks)
)

또는 awk를 사용하십시오.

$ awk '{r=r $0 ORS} /^)/{if (r ~ /Device=A/) printf "%s", r; r=""}' file
(
Device=A
Data=asdfasdf(aewf)
Lorem=Ipsum
)
(
Device=A
Data=asdfasdf(jalks)
)

답변3

사용행복하다(이전에는 Perl_6으로 알려짐)

~$ raku -e '.put for slurp.comb( /^^ \( \n "Device=A" \n [\N+ \n]+? \) $$ / );'  file

#OR

~$ raku -e '.put for slurp.comb: /^^ \( \n "Device=A" \n [\N+ \n]+? \) $$ / ;'  file

comb간단히 말해서 Raku는 정반대입니다 split. comb일치하는 요소를 추출하는 정규식 일치자를 제공할 수 있습니다 .

위의 코드는 slurp각 줄을 자동으로 자르지 않고 파일을 넣습니다(모든 줄을 한 번에 읽음). 요소를 추출하려면 Device=A필요한 일치 행( \n아직 존재하는 줄 바꿈 포함)을 나열하면 됩니다.

참고: 그룹화는 [\N+ \n]+?개행 문자가 아닌 하나 이상의 문자와 개행 문자로 이루어진 탐욕스럽지 않은 시퀀스입니다. 여기서 이... 그룹화 패턴은 탐욕스럽지 않게 한 번 이상 발생합니다.\N\n[]+?

예제 출력:

(
Device=A
Data=asdfasdf(aewf)
Lorem=Ipsum
)
(
Device=A
Data=asdfasdf(jalks)
)

https://raku.org

답변4

sed 솔루션은 다음과 같습니다.

$ sed -n '/=A/,/^)/p' infile | sed '/=A/i ('

(
Device=A
Data=asdfasdf(aewf)
Lorem=Ipsum
)
(
Device=A
Data=asdfasdf(jalks)
)

관련 정보