sed 또는 무엇을 사용하여 여러 줄을 일치시키고 삭제합니까? 즉 "Directory" 뒤에 두 개의 빈 줄이 있습니까?

sed 또는 무엇을 사용하여 여러 줄을 일치시키고 삭제합니까? 즉 "Directory" 뒤에 두 개의 빈 줄이 있습니까?

하드 드라이브의 모든 디렉터리를 나열하는 파일이 있습니다. "Directory"라는 단어 뒤에 두 개의 빈 줄이 있는 줄의 모든 인스턴스를 삭제하고 싶습니다. 즉, 시퀀스가 ​​발생할 때마다 해당 줄 세 개를 모두 삭제하고 싶습니다.

"<DIR> .", "<DIR> ..", -- 가 포함된 줄은 이미 모두 삭제했지만 "0 Files"아직 남은 내용이 남아 있습니다.

원래 작업은 다음 패턴으로 각 6줄 시퀀스를 삭제하는 것이었습니다.

Directory of m:\Winter Interludes

12/20/2020  10:24 PM    DIR          .
12/20/2010  10:24 PM    DIR          ..
               0 File(s)              0 bytes

답변1

펄:

전체 파일을 배열로 후루룩 마시다

배열 인덱스에 대한 루프

설정된 플래그가 없고 첫 번째 일치 항목이 나타나면 플래그를 설정합니다.

플래그와 두 번째 줄이 일치하면 다른 플래그를 설정합니다.

플래그와 세 번째 줄이 모두 일치하면 배열에서 세 줄을 삭제합니다.

루프 종료

수정된 배열을 다시 인쇄

파이썬에서도 작동해야 합니다

--

여러 줄에 걸쳐 일치시키기 위해 단일 정규식을 사용하려는 경우 Perl에는 이를 위한 정규식 이후 플래그 "m"이 있습니다. Perlre에서:

m 문자열을 여러 줄로 취급합니다. 즉, ^'' and$''를 문자열의 시작이나 끝 부분에서만 일치하는 것에서 문자열 내의 어느 줄의 시작이나 끝 부분으로든 변경합니다.

s 문자열을 한 줄로 취급합니다. 즉, .'' to match any character whatsoever, even a newline, which it normally would not match. The /s and /m modifiers both override the $* setting. That is, no matter what $* contains, /s without /m will force 문자열의 시작 부분에서만 일치하도록 ^''를 변경하고 $'' to match only at the end (or just before a newline at the end) of the string. Together, as /ms, they let the.''는 어떤 문자와도 일치하도록 변경하면서 ^'' and$''는 각각 문자열 내의 개행 문자 바로 뒤와 바로 앞에서 일치하도록 허용합니다.

답변2

perl -0777 -p -e 's/[^\n]*디렉토리[^\n]*\n\n\n//sg' 입력

답변3

vim에서는 다음을 사용할 수 있습니다. :%s:Directory{ctrl+v, return}{ctrl+v}return:

관련 정보