새 줄까지 한 단락에서 역방향 일치를 인쇄해야 합니다(역방향 일치 패턴은 단락의 첫 번째 줄과 단어의 끝에 있음).
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'
에 추가하세요 .awk
awk
그것으로 sed
당신은 할 수 있습니다
$ sed '/ZZZ$/,/^$/d' file
sometext tobe here xxx_yyyy: AAA
sjhdajsh
skdjah
hjk
즉, " ZZZ
임의의 줄로 시작하고 다음 빈 줄로 끝나는 모든 줄을 삭제"합니다. 와 함께 sed
표현식을 사용할 수도 있습니다 . 하지만 혹시 라도 참고해주세요/ZZZ$/,/^$/!p
sed -n
ZZZ
다른단락의 첫 번째 줄이 아닌 다른 줄도 삭제를 유발합니다.
이 문제는 분명히 해결될 수 있습니다(단락을 한 줄씩 읽고 예약된 공간에 입력한 다음 무엇을 인쇄하고 무엇을 버릴지 결정함으로써). 그러나 awk
위의 변형을 사용하는 것보다 더 번거롭습니다.
[^ZZZ]
질문에 사용한 표현 에 대해 언급하면 됩니다 . 이는 [^Z]
가 아닌 모든 단일 문자 와 정확히 동일하며 일치합니다 Z
. 마찬가지로, [^text]
또는 이외의 모든 단일 문자가 일치합니다.[^etx]
e
t
x