여러 HTML 문서에서 개별 항목 항목을 주석 처리하려고 합니다.
패턴을 몇 가지 변형과 일치시키고 일치하는 패턴을 대체해야 합니다.<!-- -->
변경 사항은 다음과 같습니다.
<li><a href="latest-news.htm" >Latest News</a></li>
<li><a href="pages/latest-news.htm" >Latest News</a></li>
<li><a href="../../latest-news.htm" >Latest News</a>
</li>
이는 주요 변형이지만 .htm 대신 최신-news.php인 변형도 있을 수 있습니다. 또 다른 변형은 ../
지금까지 나는 이것을 가지고 있습니다 :
find ./ -name "*.htm" -exec perl -p0e 's/(^\s*<li><a href="((\.\.\/)*|pages\/)?latest-news\.(htm|php)"\s*>Latest News<\/a>\s*(\n)?\s*<\/li>\s*)/<!-- $1 -->/g' {} \; | grep -C 1 "latest-news" | grep -C 1 "latest-news"
거기에 무슨 문제가 있는지는 모르겠지만 아무것도 일치하지 않습니다. 최종 grep은 발견된 모든 파일에서 이 줄의 모든 인스턴스를 주석 처리 없이 표시해야 합니다.
저는 이제 막 Perl과 정규 표현식 작업을 시작했는데, 이는 지금까지 해본 작업 중 가장 복잡한 작업 중 하나입니다.
내가하려는 일이 가능합니까, 아니면 이것을 달성하는 더 좋은 방법이 있습니까?
일부 정규식 테스트 사이트를 사용해 보았지만 대부분 표준 Perl 정규식 테스트가 없으며 PHP 정규식을 사용하고 모든 변형과 일치하는 사이트를 실행하려고 하면 작동하지 않습니다.
더 많은 정보를 추가할 수 있으면 알려주시기 바랍니다.
몇 주 전에 일치하는 여러 줄 변형을 얻을 수 있었지만 어떤 버전의 명령이 이를 수행했는지 알 수 없습니다. 더 많은 테스트를 할 수 있도록 현재 모든 파일의 백업을 시작하고 있습니다.
내 버전
$> perl -v
This is perl 5, version 28, subversion 1 (v5.28.1) built for x86_64-linux-gnu-thread-multi
(with 61 registered patches, see perl -V for more detail)
$> grep -V
grep (GNU grep) 3.3
$> uname -mrs
Linux 5.3.0-24-generic x86_64
$> lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 19.10
Release: 19.10
Codename: eoan
고쳐 쓰다
정규식 검색을 다음으로 업데이트했습니다.
(<li><a href="(\.\.\/|pages\/)*latest-news.(htm|php)"\s*>Latest News<\/a>\s*(\n)?\s*<\/li>)\n?
이는 몇 가지 한 줄 변경 사항을 제외한 모든 내용을 캡처합니다. 이전에는 일치하지 않거나 여전히 일치하지 않는 경우 ../
도 있습니다 . 일치하지 않는 줄 앞에 더 많은 공백(탭 3개와 탭 또는 공백 문자 1개)이 있었습니다 .page/
latest-news.htm
<li>
검색 패턴에 before를 추가하면 주석 \s*
이 <li>
이전 줄의 끝부터 시작되지만 여전히 시작 부분에 공백이 더 많은 줄을 캡처하지 못합니다.
<li><a href="latest-news.htm" class="current">Latest News</a></li>
^ 아직 일치하지 않는 줄입니다.
답변1
어쩌면 다음과 같은 것일 수도 있습니다.
perl -0777 -pe '
s{<li>\s*<a\s[^>]*href="[^"]*latest-news\.(?:htm|php)"[^>]*>\s*Latest News\s*</a>\s*</li>}
{<!-- $& -->}g' your-file.htm
충분할 것입니다.
m
여러 줄 모드( 플래그 사용 ) 를 활성화하지 않으면 항목의 시작 부분이 아닌 항목의 시작 부분( 전체 입력이 ^
포함된 NUL로 구분된 각 레코드 )만 일치합니다.-0
-0777
제목의 모든 줄. 또한 \s
개행 문자도 일치합니다. 가로 간격만 일치시키려면 다음을 사용하세요 \h
(그러나 내가 아는 한 HTML은 가로와 세로 사이에 차이가 없으며 NL과 SPC는 구문에 관한 한 적어도 , , 인용된 속성 값 외부에서 상호 교환 가능 <pre>
합니다 CDATA...
. ..).
이미 주석이 달린 섹션에서 대체를 방지하려면 다음을 수행할 수 있습니다.
perl -0777 -pe '
s{(<!--.*?-->)|<li>\s*<a\s[^>]*href="[^"]*latest-news\.(?:htm|php)"[^>]*>\s*Latest News\s*</a>\s*</li>}
{$1 // "<!-- $& -->"}gse' your-file.htm