해당 줄이나 다음 줄에 특정 문자열이 포함되어 있지 않은 경우 해당 줄을 인쇄하는 방법

해당 줄이나 다음 줄에 특정 문자열이 포함되어 있지 않은 경우 해당 줄을 인쇄하는 방법

입력.txt:

    8B0C
    remove
    8B0D
    remove
    8B0E
    remove
    8B0F
    8B10
    remove
    8B14
    remove
    8B15
    remove
    8B16
    remove
    8B17
    remove
    8AC0
    8AC1
    remove
    8AC2
    remove
    8AC3
    remove
    8AE4
    8AE5
    8AE6
    remove

원하는 출력:

    8B0F
    8AC0
    8AE4
    8AE5

해당 줄이나 다음 줄에 "삭제"가 포함되어 있지 않으면 해당 줄을 인쇄하고 싶습니다. 저는 Solaris 5.10, KSH를 사용하고 있습니다.

답변1

그리고 sed:

sed '$!N;/remove/!P;D' infile

그러면 Next 라인이 패턴 공간으로 당겨지고( !lat $라인이 아닌 경우) 패턴 공간이 일치하는지 확인합니다 remove. 존재하지 않는 경우(패턴 공간의 어느 라인에도 string 이 포함되어 있지 않음을 의미 ) 첫 번째 ewline 문자로 인쇄 remove됩니다 (즉, 첫 번째 라인을 인쇄합니다). 그런 다음 첫 번째 줄 바꾸기 문자를 삭제하고 루프를 다시 시작합니다. 이런 식으로 패턴 공간에는 두 개 이상의 줄이 없습니다.P\nD\n


루프 앞뒤에 다음을 추가하여 패턴 공간을 살펴보면 이해하기 더 쉬울 수 있습니다 N.PDlN

sed 'l;$!N;l;/remove/!P;D' infile

따라서 예제의 마지막 6줄을 사용하세요.

    8AC3
    remove
    8AE4
    8AE5
    8AE6
    remove

마지막 명령 출력:

    8AC3$
    8AC3\n $ 삭제
    $ 삭제
    삭제\n 8AE4$
    8AE4$
    8AE4\n 8AE5$
    8AE4
    8AE5$
    8AE5\n 8AE6$
    8AE5
    8AE6$
    8AE6\n $ 삭제
    $ 삭제
    $ 삭제

간단한 설명은 다음과 같습니다.

cmd 출력 cmd
l     8AC3$                  N # read in the next line
l     8AC3\n    remove$      D # delete up to \n (pattern space matches so no P)
l     remove$                N # read in the next line
l     remove\n    8AE4$      D # delete up to \n (pattern space matches so no P)
l     8AE4$                  N # read in the next line
l     8AE4\n    8AE5$        # pattern space doesn't match so print up to \n
P     8AE4                   D # delete up to \n
l     8AE5$                  N # read in the next line
l     8AE5\n    8AE6$        # pattern space doesn't match so print up to \n
P     8AE5                   D # delete up to \n 
l     8AE6$                  N # read in the next line
l     8AE6\n    remove$      D # delete up to \n (pattern space matches so no P)
l     remove$                # last line so no N 
l     remove$                D # delete (pattern space matches so no P)

답변2

awk '
    !/remove/ && NR > 1 && prev !~ /remove/ {print prev} 
    {prev = $0} 
    END {if (!/remove/) print}
' Input.txt 

답변3

gawk 'BEGIN{ RS="remove\n"; ORS="" }
      RT{ print gensub("[^\n]*\n$","","") }; !RT{ print }' file

위의 방법은 레코드를 읽지 않습니다.한 줄씩, 대신에 다음과 같이 읽습니다.여러 줄하나의 레코드 구분 기호(RS)에서 다음(또는 파일 끝)까지의 레코드는 RS행 자체(후행 `\n 포함)를 "삭제"하는 것입니다.

!RT마지막 행이 행이 아닌 경우 테스트해야 합니다 RS.
RT,ㅏ바보주의는 현재 레코드의 실제 텍스트입니다 RS.
gensub또한바보주의.

표시된 선을 확인해야 하는 경우성냥한 줄이 아닌 한 줄의 어느 곳에서나 "삭제"동일한"삭제"한 다음 레코드 구분 기호를 다음과 같이 변경하십시오.

`RS="[^\n]*remove[^\n]*\n"`  

산출:

8B0F
8AC0
8AE4
8AE5

관련 정보