유사한 두 패턴 사이의 특정 패턴이 일치하지 않는 경우 유사한 두 패턴 사이의 모든 라인을 삭제합니다.

유사한 두 패턴 사이의 특정 패턴이 일치하지 않는 경우 유사한 두 패턴 사이의 모든 라인을 삭제합니다.

제목은 다음과 같아야 합니다 Remove all lines between two similar patterns, including the line of the starting pattern. if another specific pattern in between is not matched. Google에서 답변을 검색하는 다른 사람들이 읽기 쉽기 때문에 더 짧게 만들었습니다.

질문에 관하여: 특정 컴퓨터에 대해 유가가 있는 주식과 시장이 불가능한 주식 목록이 있습니다. 공유가 나열될 수 있는 모든 컴퓨터의 목록을 만들고 읽을 수 없는 공유를 삭제하고 싶습니다. 하지만 두 가지 문제에 부딪혔습니다. 먼저 두 개의 유사한 패턴 사이의 모든 라인을 올바르게 삭제하십시오. 둘째, 특정 패턴이 발견되면 유사한 두 단어 사이의 줄을 삭제하지 않는 방법입니다.

내 조언은

Shares for DED-SHD-ED-5:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        E$
        H$
        IPC$

Shares for DED-SHD-ED-6:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$
    [--- Listable Shares ---]
        print$
Shares for DED-SHD-ED-7:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$
    [--- Listable Shares ---]
        backup      backup2
Shares for DED-SHD-ED-8:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$

Shares for DED-SHD-ED-9:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$
        VBRCatalog
    [--- Listable Shares ---]
        backup      backup2

다음 명령을 사용하여 읽을 수 없는 모든 공유를 제거했습니다 awk '/Listable Shares/,/Shares for/' input.txt. 이 명령의 문제는 DED-SHD-ED-8no 였습니다 Listable Shares. 아래 컴퓨터를 벗겨내고 에서 DED-SHD-ED-9판매 가능한 주식을 볼 수 있습니다.DED-SHD-ED-9DED-SHD-ED-8

아래 출력을 참조하세요(목록에 있는 첫 번째 컴퓨터의 이름이 누락되었다는 것을 알고 있지만 문제가 되지 않습니다).

    [--- Listable Shares ---]
        print$
Shares for DED-SHD-ED-7:
    [--- Listable Shares ---]
        backup      backup2
Shares for DED-SHD-ED-8:
    [--- Listable Shares ---]
        backup      backup2

이 문제를 해결하기 위해 내 생각은 awk '/Listable Shares/,/Shares for/' input.txt. 처음에는 "공유 대상"과 "공유 대상" 사이의 모든 줄을 제거해 보았습니다. 나는 더 간단한 답변을 찾고 현재로서는 이해할 수 없는 복잡한 답변을 피하기 위해 포럼을 둘러보았습니다. 예를 들어, 이 명령을 사용했는데 sed '/^Shares for/,/^Shares for/{//!d;};' input.txt여기서는 sed '/Shares for/,/:/{//!d;};' input2.txt컴퓨터 사이의 선 절반을 제거했습니다.

산출

Shares for DED-SHD-ED-5:
Shares for DED-SHD-ED-6:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$
    [--- Listable Shares ---]
        print$
Shares for DED-SHD-ED-7:
Shares for DED-SHD-ED-8:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$

왜 컴퓨터 데이터의 절반만 삭제됩니까? 왜인지 이해가 안 돼요

Listable다음 아이디어 는 패턴이 해당 줄에서 일치하는 경우 "Shares for"와 "Shares for" 사이의 줄이 삭제되지 않도록 명령에 제외를 추가하는 것이었습니다 . 그런 다음 DED-SHD-ED-5및 등의 데이터가 없는 컴퓨터를 삭제합니다 DED-SHD-ED-7. 하지만 어쩌면 이것이 최선의 접근 방식이 아닐 수도 있습니다. "Listable" 스키마가 표시되지 않으므로 첫 번째 스키마의 행을 삭제하는 것이 더 나을 수도 있습니다.

이 문제를 올바르게 처리하는 방법에 대한 도움과 통찰력을 원합니다.

예상 출력:

Shares for DED-SHD-ED-6:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$
    [--- Listable Shares ---]
        print$
Shares for DED-SHD-ED-7:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$
    [--- Listable Shares ---]
        backup      backup2
Shares for DED-SHD-ED-9:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$
        VBRCatalog
    [--- Listable Shares ---]
        backup      backup2

답변1

이것이 당신에게 효과가 있습니까? shares예제 입력을 위해 선택한 파일 이름입니다.

sed -e 'tD' -e '$!N;/.\nShares/s/\n/&&/;:D' -e 'P;D' shares | awk 'BEGIN{RS="\n\n";FS="\n"}/Listable/'
Shares for DED-SHD-ED-6:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$
    [--- Listable Shares ---]
        print$
Shares for DED-SHD-ED-7:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$
    [--- Listable Shares ---]
        backup      backup2
Shares for DED-SHD-ED-9:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$
        VBRCatalog
    [--- Listable Shares ---]
        backup      backup2

기본적으로 줄바꿈 이 없으면 sed앞에 삽입됩니다. 따라서 줄바꿈을 다음 과 같이 Shares사용할 수 있습니다 . 그러면 문제는 간단합니다. 해당 단어가 포함된 레코드만 인쇄합니다 .RS="\n\n"awkListable

답변2

이해하다:

  • Shares블록에 문자열이 포함되어 있으면 블록을 인쇄합니다.Listable Shares

일단 들어가면 awk일반적으로 쌍을 제거할 수 있습니다 sed.

(상세한) awk아이디어:

$ cat shares.awk

NF == 0           { next }                        # skip blank lines
$1 == "Shares"    { if (print_block)              # if 1st field is "Shares"; if flag is set (==1) then ...
                       print block                # print the previous block
                    print_block = 0               # clear the flag
                    block = $0                    # initialize a new block
                    next                          # skip to next input line
                  }
/Listable Shares/ { print_block = 1 }             # if line contains "Listable Shares" then set flag
                  { block = block ORS $0 }        # append current line to end of block
END               { if (print_block)              # flush last block to stdout?
                       print block
                  }

시험 운전해 보세요:

$ awk -f shares.awk input.txt
Shares for DED-SHD-ED-6:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$
    [--- Listable Shares ---]
        print$
Shares for DED-SHD-ED-7:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$
    [--- Listable Shares ---]
        backup      backup2
Shares for DED-SHD-ED-9:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$
        VBRCatalog
    [--- Listable Shares ---]
        backup      backup2

답변3

사용행복하다(이전 Perl_6)

~$ raku -e '.put for slurp.comb(/^^Shares .*? <?before ^^Shares | $ >/).grep(/Listable/);'   file 

#OR:

~$ raku -e '.put for lines.join("\n").comb(/^^Shares .*? <?before ^^Shares | $ >/).grep(/Listable/);'   file

Raku는 Perl 계열의 프로그래밍 언어입니다. split정규식 패턴의 파괴적인 설정과 반대되는 것으로 간주될 수 있는 Raku는 comb원하는 요소를 선택할 수 있는 루틴을 제공합니다. 위에서 .comb(/^^Shares .*? <?before ^^Shares | $ >/)입력 파일은 다음을 사용하여 레코드를 선택하여 여러 레코드로 분할됩니다.

  • ^^Shares줄 시작 부분의 텍스트는 "share"이고,
  • .*?탐욕스럽지 않은 임의의 문자 수,
  • <?before ^^Shares | $ >?before긍정적인 예측은 다음 레코드 패턴을 볼 때 ^^Shares또는 $파일 자체의 앞/끝에서 패턴을 중지하는 것을 의미합니다.

체인의 두 번째 작업에서는 블록이 포함된 레코드 grep만 반환하는 데 사용됩니다 .Listable

입력 예:

Shares for DED-SHD-ED-5:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        E$
        H$
        IPC$

Shares for DED-SHD-ED-6:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$
    [--- Listable Shares ---]
        print$
Shares for DED-SHD-ED-7:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$
    [--- Listable Shares ---]
        backup      backup2
Shares for DED-SHD-ED-8:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$

Shares for DED-SHD-ED-9:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$
        VBRCatalog
    [--- Listable Shares ---]
        backup      backup2

예제 출력:

Shares for DED-SHD-ED-6:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$
    [--- Listable Shares ---]
        print$

Shares for DED-SHD-ED-7:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$
    [--- Listable Shares ---]
        backup      backup2

Shares for DED-SHD-ED-9:
    [--- Unreadable Shares ---]
        ADMIN$
        C$
        IPC$
        VBRCatalog
    [--- Listable Shares ---]
        backup      backup2

참고: 데이터가 언어 내부적으로 어떻게 표현되는지 확인하는 것이 도움이 되는 경우가 많으므로 여기에 출력이 있습니다.뒤쪽에 comb별도의 레코드로 저장되지만앞으로 grep핑에 필요한 블록:

~$ raku -e '.raku.put for slurp.comb(/^^Shares .*? <?before ^^Shares | $ >/);'   file
"Shares for DED-SHD-ED-5:\n    [--- Unreadable Shares ---]\n        ADMIN\$\n        C\$\n        E\$\n        H\$\n        IPC\$\n\n"
"Shares for DED-SHD-ED-6:\n    [--- Unreadable Shares ---]\n        ADMIN\$\n        C\$\n        IPC\$\n    [--- Listable Shares ---]\n        print\$\n"
"Shares for DED-SHD-ED-7:\n    [--- Unreadable Shares ---]\n        ADMIN\$\n        C\$\n        IPC\$\n    [--- Listable Shares ---]\n        backup      backup2\n"
"Shares for DED-SHD-ED-8:\n    [--- Unreadable Shares ---]\n        ADMIN\$\n        C\$\n        IPC\$\n\n"
"Shares for DED-SHD-ED-9:\n    [--- Unreadable Shares ---]\n        ADMIN\$\n        C\$\n        IPC\$\n        VBRCatalog\n    [--- Listable Shares ---]\n        backup      backup2\n\n"

https://docs.raku.org/언어/operators#Operators
https://docs.raku.org/routine/comb
https://docs.raku.org/routine/grep
https://raku.org

관련 정보