複数の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?
これは、いくつかの1行の変更を除くすべてのコンテンツをキャプチャします。以前は一致しないか、まだ一致しない場合../
があります。一致しない行の前に、より多くのスペース(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は水平と垂直の間に違いはありませ<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