ディレクトリ内のすべてのファイルから2つのタグ(htmlタグ)間のすべてのテキストを削除するコマンドまたはスクリプト?

ディレクトリ内のすべてのファイルから2つのタグ(htmlタグ)間のすべてのテキストを削除するコマンドまたはスクリプト?

削除する特定のタグを含むhtmlファイルでいっぱいのディレクトリがあります。たとえば、<p class="message"> </p>すべてのファイルから消えたいのですが、タグ内のテキストはファイルごとに異なります。

各ファイルのテキストが同じ場合

find . -type f -name '*.html' -exec sed -i'' -e 's/existing/replacement/g' {} +

古いテキストを新しいテキストに置き換えます。しかし、上記の例では、ラベル間のテキストが異なるため、これは機能しません。

指定された2つの文字列間のすべての項目を削除または置き換えることができる同様のコマンドまたはツールはありますか?

答え1

HTMLタグはしばしば複数行にまたがるか、1行に複数のタグがある可能性があるため、perlファイルの内容全体が完全に処理され、*?貪欲でないバージョンが*最小限のコンテンツと一致するフルルックモードを使用できます。オープンタグとクローズタグの間に可能です。

オプション-iも非標準であり、これをサポートするオプションは、実際にはバックアップサフィックス(vs)がperl使用されていない場合のバリアントからコピーされます。-i-i ''

find . -name '*.html' -type f -exec perl -0777 -pi -e '
  s{<p class="message">.*?</p>}{ }gs' {} +

答え2

使用幸せ(以前のPerl_6)

~$ raku -e 'my regex L { "<p class=\"message\">" };                  \          
            my regex R { "</p>" };                                   \                               \
            my $dest-dir = "/path/to/destination/dir/";              \
            for dir() -> $file {                                     \
              with $file.slurp { / <L> .*? <R> /                     \
                ?? my $new-file = .subst( :g, / <L> <(.*?)> <R> / )  \
                !! next;                                             \
              spurt("$dest-dir" ~ "$file".IO, $new-file)             \
              }                                                      \
            };'

RakuはPerlプログラミング言語シリーズのプログラミング言語です。つまり、正規L表現と正規R表現の両方が宣言され、値が割り当てられます。$dest-dirスカラーを宣言し、文字列を割り当てます。現在のパスはdir()繰り返され、for$file.IOオブジェクトは次のブロックで分析/修正されます。

外部ブロックである$fileed slurp(一度にすべて読み取る)は、内部ブロック内のテキストに.*?「0回以上すべての文字を含む正規表現が含まれているか、その間に正規表現が含まれているかをすぐにテストします。」ここで、 L-and-R正規表現は山かっこで挿入する必要があります。つまり、<L>-and- は一致子の内側に<R>あるからです。/ ... /

内部ブロック Raku の三項演算子 テスト ?? 本物 !! 間違った 使用される。 3つの正規表現接続が見つかると、中央の「原子」が...キャプチャタグでラップされます。<(.*?)>これは、外部一致が削除され、削除のみ(何も)されないことを示します。 A は、これらの内部文字を削除することによって生成されます。正規表現が見つからない場合、ブロックはファイルの前にジャンプします(内部ブロックの終了)。これにより、新しく作成されたファイルを元の名前で正しいディレクトリに書き込むことができます。<()>.*?subst$new-filenext$new-filespurt$file

入力例(オリジナルdir/file):

first line
<p class="message"> foo </p>
<p class="message"> bar </p>
<p class="message">
          baz
  </p>

last line

出力例(新規作成dir/file

first line
<p class="message"></p>
<p class="message"></p>
<p class="message"></p>

last line

上記の「サンプル出力」は、開始/終了タグが別の行にあっても、指定されたhtmlタグの内部テキストが削除される3つのインスタンスを示しています。新しい(リテラル文字列)テキストに置き換えるには、次のスニペットを変更します。

から:
.subst( :g, / <L> <(.*?)> <R> / )

到着する:
.subst( :g, / <L> <(.*?)> <R> /, "new-text" )


https://docs.raku.org/routine/dir
https://docs.raku.org/type/Regex
https://raku.org

答え3

個人的に私は「これを確認してください」と答えるのが嫌いです。しかし、この場合、他のスレッドで正確なプロセスを非常によく説明します。

sed を使用して、一致する 2 つのパターン間のすべての行を削除します。

関連情報