需要幫助 Perl 正則表達式註釋掉 html 中的行
我正在嘗試在一堆 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