HTMLファイルからすべてのIDを削除するには、grepを試してください。

HTMLファイルからすべてのIDを削除するには、grepを試してください。

id=" "ファイルからすべてを削除しようとしていますが、.htmlどこで間違っているのかわかりません。正規表現を使ってみましたが、得たのは.htmlUbuntu端末でファイルをレンダリングするだけです。

パスワード:

grep -Ev '^$id\="[a-zA-Z][0-9]"' *.html

で実行していますbash ex.sh

答え1

私の判断にずれても(sed一部)投稿します。

つまり、迅速で汚れた問題を解決するには、続行してください。 Python、Perlなどのような他のものは、正規表現に頼らずにHTML文書を処理するモジュールに依存します。

より簡単な方法は、例えばsedを使用することです。

sed 's/\(<[^>]*\) \+id="[^"]*"\([^>]*>\)/\1\2/' sample.html > noid.html

説明する:

            +--------------------------------- Match group 1
            |                      +---------- Match group 2
         ___|___                ___|___
        |       |              |       |  
sed 's/\(<[^>]*\) \+id="[^"]*"\([^>]*>\)/\1\2/' sample.html > noid.html
     |   |  | |   |  |    | ||    |  |      |
     |   |  | |   |  |    | ||    |  |      +- \1\2  Subst. with group 1 and 2
     |   |  | |   |  |    | ||    |  +-------- >     Closing bracket
     |   |  | |   |  |    | ||    +----------- [^>]* Same as below
     |   |  | |   |  |    | |+---------------- "     Followed by "
     |   |  | |   |  |    | +----------------- *     Zero or more times
     |   |  | |   |  |    +------------------- [^"]  Not double-quote
     |   |  | |   |  +------------------------ id="  Literal string
     |   |  | |   +---------------------------  \+   Space 1 or more times
     |   |  | +------------------------------- *     Zero or more times 
     |   |  +--------------------------------- [^>]  Not closing bracket
     |   +------------------------------------ <     Opening bracket
     +---------------------------------------- s     Substitute

sed -iファイルを所定の位置に編集します。 (後悔するかもしれませんが、元に戻すことはできません。)


Perlを使った例:

#!/usr/bin/perl

use strict;
use warnings;

use HTML::TokeParser::Simple;
use HTML::Entities;
use utf8;

die "$0 [file]\n" unless defined $ARGV[0];

my $parser = HTML::TokeParser::Simple->new(file => $ARGV[0]);

if (!$parser) {
    die "No HTML file found.\n";
}

while (my $token = $parser->get_token) {
    $token->delete_attr('id');
    print $token->as_is;
}

grepコマンドは何も一致しません。ただし、反転オプションを使用すると、-v一致しないすべての項目が印刷されるため、ファイル全体が印刷されます。

grepはそうではありません内部ファイル修飾子ただし、通常はファイル内のコンテンツを検索するツールです。たとえば、次のようになります。

grep -o '\(<[^>]*\)id="[^"]*"[^>]*>' sample.html

-o一致するパターンのみが印刷されることを示します。 (全行ではない)

sedなどはawk通常、ストリームまたはファイルを編集するために使用されます。たとえば、上記の例のようになります。


grepにいくつかの誤った概念があります。

 id\="[a-zA-Z][0-9]"

正確に一致:

  1. id=
  2. 一つ範囲内の文字a-zまたはA-Z
  3. 続いて一つ数字

つまり、次のようになります。

id="a0"
id="a1"
id="a2"
...
id="Z9"

次のものはありません:id="foo99"またはid="blah-gah"


また、次のように一致します。

 ^ <-- start of line (As it is first in pattern or group)
 $ <-- end of line   (As you use the `-E` option)
 # Else it would be:
 ^ <-- start of line (As it is first in pattern or group)
 $ <-- dollar sign   (Does not mean end of line unless it is at end of
                      pattern or group)

だから何もありません。

答え2

私は真剣に提案するものではありませんが、htmlを許可するXSLTプロセッサを使用してこれを行う方法を見てきました。次に実行xsltproc --html strip-html-id.xslt input.html

<!-- strip-html-id.xslt -->

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="html" doctype-system="about:legacy-compat" />

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@id" />

</xsl:stylesheet>

答え3

で述べたようにもう一つの答えRuby one-linerを使用してHTMLを解析できます。たとえば、次のように使用できます。

ruby -rnokogiri -e 'doc = Nokogiri::HTML(readlines.join); doc.xpath("//@id").remove; puts doc' sample.html

この行は、引数として提供されたファイル、サンプル.htmlを解析し、そのファイルのすべてのid属性を削除して出力を印刷します。 Sample.htmlが次の場合

<!DOCTYPE html>
<html>
  <body>
    <h2 id="section1">Section 1</h2>
    <h2 id="section2">Section 3</h2>
    <h2>Section 4</h2>
    <h2 id="section5">Section 5</h2>
  </body>
</html>

それは出力する

<!DOCTYPE html>
<html><body>
    <h2>Section 1</h2>
    <h2>Section 3</h2>
    <h2>Section 4</h2>
    <h2>Section 5</h2>
  </body></html>

以下Nokogiri::HTML()を使用してhtmlbodyDOCTYPEhtmlbodyDOCTYPE

ruby -rnokogiri -e 'doc = Nokogiri::HTML.fragment(readlines.join); doc.search("@id").remove; puts doc' sample.html

同じ入力ファイルの場合は出力されます。

    <h2>Section 1</h2>
    <h2>Section 3</h2>
    <h2>Section 4</h2>
    <h2>Section 5</h2>

関連情報