패턴 일치 라인 및 다음 라인 삭제

패턴 일치 라인 및 다음 라인 삭제

파일에서 패턴 일치의 모든 인스턴스를 제거하려고 합니다(패턴과 일치하는 경우). 일치하는 항목이 있으면 일치하는 패턴이 있는 (전체) 행과 다음 행이 삭제됩니다.

다음 줄은 항상 패턴과 일치하는 줄 뒤에 나타나지만 그렇지 않으면 파일의 다른 영역에 나타납니다.

나는 grep을 사용하고 있으며 예상대로 파일에서 다음 줄의 모든 항목을 제거합니다.

패턴과 일치하는 줄 뒤에 오는 경우에만 다음 줄을 삭제하는 방법이 있습니까?

답변1

당신은 sed그것을 사용할 수 있습니다N그리고d명령과{}막힌:

sed -e '/pattern here/ { N; d; }'

일치하는 각 줄에 대해 의 pattern here코드가 실행됩니다 {}. N또한 다음 줄을 패턴 공간에 넣고 d다음 줄을 계속하기 전에 모든 것을 삭제합니다. 이는 모든 POSIX 호환에서 작동합니다 sed.

답변2

이 기능을 켜면 대부분의 seds는 마지막 줄을 인쇄하지 않습니다. 하지만 GNU는 그렇습니다. 따라서 삭제하려는 패턴이 마지막 줄에 있으면 인쇄됩니다. 때로는 버퍼를 가득 채우는 것이 더 나을 때도 있습니다. 예를 들어 항상 2줄을 유지하세요.N$sedN와는 별개로인쇄하고 싶지 않은 줄에. 다음을 수행할 수 있습니다.

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

관련 정보