sed의 역 매칭은 개행까지 모든 줄을 인쇄합니다.

sed의 역 매칭은 개행까지 모든 줄을 인쇄합니다.

새 줄까지 한 단락에서 역방향 일치를 인쇄해야 합니다(역방향 일치 패턴은 단락의 첫 번째 줄과 단어의 끝에 있음).

sed.을 사용해 보았지만 [^text]작동하지 않습니다.

내 패턴 문자열은 word 끝에 있습니다 xxx_yyyy: ZZZ.

sed -n '/[^ZZZ]$/,/^$/p'작동 안함.

누군가 여기서 무엇이 잘못되었는지 바로잡을 수 있습니까?

입력하다:

sometext tobe here xxx_yyyy: ZZZ
sjhdajsh 
skdjah
hjk 

sometext tobe here xxx_yyyy: AAA 
sjhdajsh 
skdjah 
hjk 

sometext tobe here xxx_yyyy: ZZZ
sjhdajsh
skdjah 
hjk

원하는 출력:

포함되지 않은 단락을 인쇄해야 함xxx_yyyy: ZZZ

sometext tobe here xxx_yyyy: AAA
sjhdajsh 
skdjah 
hjk

답변1

awk다음을 사용하는 것보다 더 쉽습니다 sed.

$ awk -v RS='' -F '\n' '!($1 ~ /ZZZ$/)' file
sometext tobe here xxx_yyyy: AAA
sjhdajsh
skdjah
hjk

먼저 레코드 구분 기호를 RS빈 문자열로 설정합니다. 이 특수 값을 사용하면 RS하나 awk이상의 빈 줄로 구분된 각 단락이 하나의 레코드로 처리됩니다. 단락의 각 줄을 필드로 처리하도록 지시 -F '\n'합니다 .awk

!($1 ~ /ZZZ$/)첫 번째 필드(첫 번째 행)가 다음 기준을 충족하는 모든 레코드(단락)에 대해 테스트가 적용됩니다.아니요문자열로 끝납니다 ZZZ. 그러한 각 단락이 인쇄됩니다.

각 출력 섹션 뒤에 빈 줄을 추가하려면 명령줄(코드 앞 ) -v ORS='\n\n'에 추가하세요 .awkawk


그것으로 sed당신은 할 수 있습니다

$ sed '/ZZZ$/,/^$/d' file
sometext tobe here xxx_yyyy: AAA
sjhdajsh
skdjah
hjk

즉, " ZZZ임의의 줄로 시작하고 다음 빈 줄로 끝나는 모든 줄을 삭제"합니다. 와 함께 sed표현식을 사용할 수도 있습니다 . 하지만 혹시 라도 참고해주세요/ZZZ$/,/^$/!psed -nZZZ다른단락의 첫 번째 줄이 아닌 다른 줄도 삭제를 유발합니다.

이 문제는 분명히 해결될 수 있습니다(단락을 한 줄씩 읽고 예약된 공간에 입력한 다음 무엇을 인쇄하고 무엇을 버릴지 결정함으로써). 그러나 awk위의 변형을 사용하는 것보다 더 번거롭습니다.


[^ZZZ]질문에 사용한 표현 에 대해 언급하면 ​​됩니다 . 이는 [^Z]가 아닌 모든 단일 문자 와 정확히 동일하며 일치합니다 Z. 마찬가지로, [^text]또는 이외의 모든 단일 문자가 일치합니다.[^etx]etx

관련 정보