Regular-Expression

需要幫助 Perl 正則表達式註釋掉 html 中的行

  • January 7, 2020

我正在嘗試在一堆 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>

這些是主要的變體,但也有一些是 latest-news.php 而不是 .htm。另一種變化是只有一組../

到目前為止我有這個:

    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 和 regex,這是迄今為止我做過的最複雜的嘗試之一。

我正在嘗試做的事情是可能的還是有更好的方法來做到這一點?

我嘗試過使用一些正則表達式測試站點,但大多數都沒有標準的 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?

這擷取了除少數單行變化之外的所有變化。如果沒有../page/之前有一些仍然不匹配latest-news.htm<li>在不匹配之前,有一個行的實例具有更多空白(3 個製表符對 1 個製表符或空格字元) 。

如果我在搜尋模式中添加\s*註釋<li>,則註釋從上一行的末尾開始,但仍然沒有捕捉到開頭有更多空白的行。

           <li><a href="latest-news.htm" class="current">Latest News</a></li>

^ 這是仍然不匹配的行。

也許是這樣的:

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您只想匹配水平間距(但 AFAIK 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

引用自:https://unix.stackexchange.com/questions/560548