HTML의 줄에 주석을 달려면 Perl 정규식에 대한 도움이 필요합니다.

HTML의 줄에 주석을 달려면 Perl 정규식에 대한 도움이 필요합니다.

여러 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

관련 정보