
하드 드라이브의 모든 디렉터리를 나열하는 파일이 있습니다. "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: