Solaris에서 두 문자열 사이의 줄 삭제

Solaris에서 두 문자열 사이의 줄 삭제

기본 awk 또는 sed를 사용하여 두 패턴 사이의 모든 줄을 삭제하고 싶습니다.

foo.txt:

----------------------------------------------------------------------  Cap in MB
line 2
line 3
line 4
line 5
---------------------------------------------------  Cap in MB
----------------------------------------------------------------------  Cap in MB
line 2
line 3
line 4
line 5
---------------------------------------------------  Cap in MB
----------------------------------------------------------------------  Cap in MB
line 2
line 3
line 4
line 5
---------------------------------------------------  Cap in MB
----------------------------------------------------------------------  Cap in MB
line 2
line 3
line 4
line 5
----------------------------------------------------------------------  Cap in MB
line 2
line 3
line 4
line 5

output.txt:

----------------------------------------------------------------------  Cap in MB
Deleted up to this point
----------------------------------------------------------------------  Cap in MB
Deleted up to this point
----------------------------------------------------------------------  Cap in MB
Deleted up to this point
----------------------------------------------------------------------  Cap in MB
line 2
line 3
line 4
line 5
----------------------------------------------------------------------  Cap in MB
line 2
line 3
line 4
line 5

저는 Solaris 5.10을 사용하고 있으며 기본 awk 및 sed만 사용하고 있습니다. 스레드 수는 2가지 패턴에 따라 다를 수 있습니다. 첫 번째 문자열이 아니라 두 번째 문자열을 바꿔야 합니다. 두 모드의 차이점은 대시 수에 있습니다. 당신이 보는 것은 foo.txt내 실제 파일입니다.

답변1

 $ awk '!f{print} /----------------------/{f=!f;if (!f)print "Deleted up to this point"}' foo.txt
----------------------------------------------------------------------  Cap in MB
Deleted up to this point
----------------------------------------------------------------------  Cap in MB
Deleted up to this point
----------------------------------------------------------------------  Cap in MB
Deleted up to this point

어떻게 작동하나요?

스크립트에는 변수가 있습니다 f. true(1) 인 경우 f삭제할 행 범위 내에 있는 것입니다. false(0)이면 인쇄되어야 하는 범위에 있는 것입니다.

기본적으로 f프로그램이 시작되면 이는 false입니다.

  • !f{print}

    ffalse이면 모든 줄을 인쇄합니다.

  • /----------------------/{f=!f;if (!f)print "Deleted up to this point"}

    점선으로 표시된 구분선에 도달하면 값이 반전됩니다 f. f가 이제 false이면 "삭제됨" 메시지를 인쇄합니다.

고쳐 쓰다

Solaris의 기본 awk에 문제가 있는 것 같습니다. 노력하다:

nawk '!f{print} /----------------------/{f=!f;if (!f)print "Deleted up to this point"}' foo.txt

또는,

/usr/xpg4/bin/awk '!f{print} /----------------------/{f=!f;if (!f)print "Deleted up to this point"}' foo.txt

또는,

/usr/xpg6/bin/awk '!f{print} /----------------------/{f=!f;if (!f)print "Deleted up to this point"}' foo.txt

수정된 질문에 답하세요

$ awk ' /^---------------------------------------------------  Cap in MB/{print "Deleted up to this point"; f=0; z=""; next;} /^----------------------------------------------------------------------  Cap in MB/{f=1; if(z)print substr(z,2); z=""; print;next;}  f{z=z"\n"$0;next;} END{print substr(z,2);}' foo.txt
----------------------------------------------------------------------  Cap in MB
Deleted up to this point
----------------------------------------------------------------------  Cap in MB
Deleted up to this point
----------------------------------------------------------------------  Cap in MB
Deleted up to this point
----------------------------------------------------------------------  Cap in MB
line 2
line 3
line 4
line 5
----------------------------------------------------------------------  Cap in MB
line 2
line 3
line 4
line 5

답변2

awk의 간단한 해결책은 다음과 같습니다. 긴 대시 후에 인쇄를 끄고 짧은 대시 후에 인쇄를 켜십시오.

awk '
    !do_not_print {print}
    $0 == "----------------------------------------------------------------------  Cap in MB" {do_not_print = 1}
    $0 == "---------------------------------------------------  Cap in MB" {do_not_print = 0}
' <foo.txt >output.txt

답변3

내 의견은. John1024와 유사하지만 내용이 한 줄에 있으므로 읽을 수 없습니다.
Solaris 8 시스템에서 테스트되었습니다.

/usr/xpg4/bin/awk \
    -v section_start='^----------------------------------------------------------------------  Cap in MB' \
    -v delete_marker='^---------------------------------------------------  Cap in MB' \
'
    $0 ~ section_start {
        for (i=1; i<=n; i++) 
            print line[i]
        n=0
        delete line
        print
        next    
    }
    {line[++n] = $0}
    $0 ~ delete_marker {
        n=1
        delete line
        line[1] = "Deleted up to this point"
    }
    END {for (i=1; i<=n; i++) print line[i]}
' foo.txt

관련 정보