제거하려는 특정 태그가 포함된 html 파일로 가득 찬 디렉토리가 있습니다. 예를 들어 <p class="message"> </p>
모든 파일에서 사라지기를 원하지만 태그 안의 텍스트는 파일마다 다릅니다.
각 파일의 텍스트가 동일한 경우에는
find . -type f -name '*.html' -exec sed -i'' -e 's/existing/replacement/g' {} +
이전 텍스트를 새 텍스트로 바꿉니다. 그러나 위의 예에서는 라벨 간의 텍스트가 다르기 때문에 이것이 작동하지 않습니다.
지정된 두 문자열 사이의 모든 항목을 삭제하거나 바꿀 수 있는 유사한 명령이나 도구가 있습니까?
답변1
HTML 태그는 종종 여러 줄에 걸쳐 있을 수 있거나 한 줄에 여러 태그가 있을 수 있으므로 perl
파일의 전체 내용이 전체적으로 처리되고 *?
탐욕스럽지 않은 버전이 *
최소한의 내용과 일치하는 후루룩 모드를 사용할 수 있습니다. 여는 태그와 닫는 태그 사이에 가능합니다.
옵션 -i
도 비표준이며 이를 지원하는 옵션은 실제로 백업 접미사( vs )가 perl
사용되지 않았을 때의 변형에서 복사 됩니다.-i
-i ''
find . -name '*.html' -type f -exec perl -0777 -pi -e '
s{<p class="message">.*?</p>}{ }gs' {} +
답변2
사용행복하다(이전 Perl_6)
~$ raku -e 'my regex L { "<p class=\"message\">" }; \
my regex R { "</p>" }; \ \
my $dest-dir = "/path/to/destination/dir/"; \
for dir() -> $file { \
with $file.slurp { / <L> .*? <R> / \
?? my $new-file = .subst( :g, / <L> <(.*?)> <R> / ) \
!! next; \
spurt("$dest-dir" ~ "$file".IO, $new-file) \
} \
};'
Raku는 Perl 프로그래밍 언어 계열의 프로그래밍 언어입니다. 즉, L
- 및 - 정규 R
표현식이 모두 선언되고 값이 할당됩니다. $dest-dir
스칼라를 선언하고 문자열을 할당합니다. 현재 패스는 dir()
반복되고 for
각 $file
.IO 객체는 다음 블록에서 분석/수정됩니다.
외부 블록인 $file
ed slurp
(한 번에 모두 읽기)는 내부 블록에서 텍스트에 .*?
"0번 이상 모든 문자를 포함하는 정규식이 포함되어 있는지, 그 사이에 정규식이 포함되어 있는지 즉시 테스트합니다." 여기서 L
-and- R
정규 표현식은 꺾쇠 괄호와 함께 삽입되어야 합니다. 즉, <L>
-and- 는 일치자 내부에 <R>
있기 때문입니다 ./ ... /
내부 블록 Raku의 삼항 연산자 시험 ??
진짜 !!
잘못된 사용된. 3개의 정규식 연결이 발견되면 이제 중앙 "원자"가... 캡처 태그로 래핑됩니다. <(.*?)>
이는 외부 일치 항목이 제거되고 제거만(아무것도) 되지 않음을 나타냅니다. A는 이러한 내부 문자를 제거하여 생성됩니다. 정규식이 발견되지 않으면 블록은 파일 앞으로 점프합니다(내부 블록 종료). 이를 통해 새로 생성된 파일을 원래 이름으로 올바른 디렉터리에 기록(ed)할 수 있습니다.<(
)>
.*?
subst
$new-file
next
$new-file
spurt
$file
입력 예(원본 dir/file
):
first line
<p class="message"> foo </p>
<p class="message"> bar </p>
<p class="message">
baz
</p>
last line
출력 예(새로 작성 dir/file
)
first line
<p class="message"></p>
<p class="message"></p>
<p class="message"></p>
last line
위의 "샘플 출력"은 시작/끝 태그가 다른 줄에 있더라도 지정된 html 태그의 내부 텍스트가 제거되는 세 가지 인스턴스를 보여줍니다. 새(리터럴 문자열) 텍스트로 바꾸려면 다음 스니펫을 변경하세요.
에서:
.subst( :g, / <L> <(.*?)> <R> / )
도착하다:
.subst( :g, / <L> <(.*?)> <R> /, "new-text" )
https://docs.raku.org/routine/dir
https://docs.raku.org/type/Regex
https://raku.org
답변3
개인적으로 저는 "이것을 확인해 보세요"라고 대답하는 것을 싫어합니다. 그러나 이 경우에는 다른 스레드에서 정확한 프로세스를 매우 잘 설명합니다.