파일에서 패턴 일치의 모든 인스턴스를 제거하려고 합니다(패턴과 일치하는 경우). 일치하는 항목이 있으면 일치하는 패턴이 있는 (전체) 행과 다음 행이 삭제됩니다.
다음 줄은 항상 패턴과 일치하는 줄 뒤에 나타나지만 그렇지 않으면 파일의 다른 영역에 나타납니다.
나는 grep을 사용하고 있으며 예상대로 파일에서 다음 줄의 모든 항목을 제거합니다.
패턴과 일치하는 줄 뒤에 오는 경우에만 다음 줄을 삭제하는 방법이 있습니까?
답변1
답변2
이 기능을 켜면 대부분의 sed
s는 마지막 줄을 인쇄하지 않습니다. 하지만 GNU는 그렇습니다. 따라서 삭제하려는 패턴이 마지막 줄에 있으면 인쇄됩니다. 때로는 버퍼를 가득 채우는 것이 더 나을 때도 있습니다. 예를 들어 항상 2줄을 유지하세요.N
$
sed
N
와는 별개로인쇄하고 싶지 않은 줄에. 다음을 수행할 수 있습니다.
seq 10 | sed -n 'x;/7/!g;//!p'
다음은 입력의 예입니다 seq
. 각 라인에서 홀드 공간과 패턴 공간을 교환합니다. 마지막으로 유지된 행이 다음과 같은 경우7
(이 경우)예약된 공간을 현재 행으로 덮어씁니다. 그런 다음 방금 가져온 줄(현재 줄)이 mismatch 와 일치하는지 다시 확인하고 7
, 그렇지 않으면 인쇄하지 않습니다. 따라서 모든 줄에서 이전 줄과 현재 줄을 확인합니다.
1
2
3
4
5
6
9
10
패턴이 마지막 줄에 해당하는 경우:
seq 10 | sed -n 'x;/10/!g;//!p'
1
2
3
4
5
6
7
8
9
인쇄할 내용과 인쇄하지 않을 내용을 더 명확하게 보여주는 또 다른 예는 다음과 같습니다.
sed -n 'x;/match/!g;//!p
' <<\DATA
match
match
1not
2not
3not
4not
5not
match
6not
match
DATA
산출
2not
3not
4not
5not
답변3
이상한 해결책 :
awk '/pattern/ { matched=1; next }
1 == matched { matched = 0; next }
{ print }' input-file
라인 1은 패턴과 일치하는 라인을 찾아 플래그를 설정하고 라인을 건너뜁니다. 2행은 플래그를 설정할 때 한 행을 건너뛰지만 플래그를 재설정합니다. 3행은 다른 두 행 중 하나가 건너뛰지 않는 행을 인쇄합니다.
원하는 경우 다음을 한 줄에 입력할 수 있습니다.
awk '/pattern/{matched=1;next} 1==matched{matched=0;next} {print}' input-file
건너뛸 줄 수를 제어할 수 있는 변형은 다음과 같습니다.
awk '/pattern/{skip=3;next} skip>0{--skip;next} {print}' input-file
skip
건너뛰어야 하는 행 수(일치하는 행 외에)를 설정합니다 .
답변4
어때요?
sed '/pattern/ {$!N;d;}' file