제목은 다음과 같아야 합니다 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-8
no 였습니다 Listable Shares
. 아래 컴퓨터를 벗겨내고 에서 DED-SHD-ED-9
판매 가능한 주식을 볼 수 있습니다.DED-SHD-ED-9
DED-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"
awk
Listable
답변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