파일이 있어요sample.txt
-------------
ord:chandru SAM
XY DUPL
KEY:ZZ
-------------
ord:RAM SAM
XY DUPL
KEY:UU
-------------
ord:chandru SAM
XY DUPL
KEY:ZZ
-------------
키워드를 기준으로 주문을 필터링 ord:chandru
하고 key:ZZ
이러한 항목이 발견되면 하이픈부터 하이픈까지 순서를 제거하여 다음과 같은 출력을 제공합니다.
-------------
ord:chandru SAM
XY DUPL
KEY:ZZ
-------------
ord:chandru SAM
XY DUPL
KEY:ZZ
-------------
답변1
GNU가 있다면 awk
다음을 추천합니다:
gawk 'BEGIN{RS="-+\n"} $0=="" || /ord:chandru/ && /KEY:ZZ/ {ORS=RT; print}' sample.txt
-------------
ord:chandru SAM
XY DUPL
KEY:ZZ
-------------
ord:chandru SAM
XY DUPL
KEY:ZZ
-------------
빈 레코드를 강제로 $0==""
인쇄합니다(레코드가 하이픈 문자열로 구분되어 있다고 생각하는 경우 파일의 첫 번째 줄이 해석되는 방식입니다).
만약 너라면아니요예 gawk
, 그렇다면 유일한 차이점은 레코드 구분 기호를 쉽게 캡처할 수 없다는 것입니다. 이는 고정 문자열이므로 제공한 예에서는 큰 문제가 아닙니다. 예를 들어 mawk
:
mawk 'BEGIN{RS="-------------\n"; ORS=RS} $0=="" || /ord:chandru/ && /KEY:ZZ/ {print}' sample.txt
-------------
ord:chandru SAM
XY DUPL
KEY:ZZ
-------------
ord:chandru SAM
XY DUPL
KEY:ZZ
-------------
답변2
이게 좀 더 신뢰성이 있어야 하는데
$ sed -n '1p; /ord:chandru/ {
N
N
/KEY:ZZ/{
N
/ord:chandru.*\n.*\n.*KEY:ZZ.*\n---.*/p
}
}' file
설명하다
-n
우리가 요청할 때까지 인쇄하지 마십시오1p
첫 번째 줄을 인쇄합니다. 여기서 하이픈이 연결된 줄이 제공될 것이라고 가정합니다(그 후에는 하이픈이 있는 후행 줄만 인쇄합니다)./ord:chandru/
패턴 찾기N
\n
해당 문자를 사용하여 개행을 나타낼 수 있도록 다음 줄을 읽으십시오.p
일치하는 줄 인쇄
답변3
사용앗:
$ awk 'BEGIN{RS="-------------"};/KEY:ZZ/&&/ord:chandru/{print RS$0}' sample.txt|egrep -v "^ *$"
산출:
-------------
ord:chandru SAM
XY DUPL
KEY:Z
-------------
ord:chandru SAM
XY DUPL
KEY:ZZ
답변4
sed -e '
/^ord:/,/^--*$/!b
H; /^ord:/h
/^--*$/!d; g
/^ord:chandru[ ]/!d
/\n[ ]*KEY:ZZ\n--*$/!d
' sample.txt
빠른 요약:
/../,/../
=>는 from 귀하의 경우와 같이 행 범위를 선택하는 데 사용되는 범위 연산자입니다 /ord:/ to /----/
.
우리 다람쥐는 이 범위(한 번에 한 범위)를 보유 영역으로 흔듭니다. 그런 다음 범위의 끝에 도달하면 /---/
`a) /ord:chandru/ && b) /key:ZZ/' 기준에 따라 해당 특정 범위를 선택하거나 거부할 때임을 알 수 있습니다.