![sed - 줄이 ^ 조건과 일치하면 패턴 범위와 일치하는 줄을 인쇄합니다.](https://linux55.com/image/217003/sed%20-%20%EC%A4%84%EC%9D%B4%20%5E%20%EC%A1%B0%EA%B1%B4%EA%B3%BC%20%EC%9D%BC%EC%B9%98%ED%95%98%EB%A9%B4%20%ED%8C%A8%ED%84%B4%20%EB%B2%94%EC%9C%84%EC%99%80%20%EC%9D%BC%EC%B9%98%ED%95%98%EB%8A%94%20%EC%A4%84%EC%9D%84%20%EC%9D%B8%EC%87%84%ED%95%A9%EB%8B%88%EB%8B%A4..png)
이 질문을 찾아서 내 문제의 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)
)
답변4
sed 솔루션은 다음과 같습니다.
$ sed -n '/=A/,/^)/p' infile | sed '/=A/i ('
(
Device=A
Data=asdfasdf(aewf)
Lorem=Ipsum
)
(
Device=A
Data=asdfasdf(jalks)
)