id=" "
ファイルからすべてを削除しようとしていますが、.html
どこで間違っているのかわかりません。正規表現を使ってみましたが、得たのは.html
Ubuntu端末でファイルをレンダリングするだけです。
パスワード:
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]"
正確に一致:
id=
- 一つ範囲内の文字
a-z
またはA-Z
- 続いて一つ数字
つまり、次のようになります。
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()
を使用してhtml
body
DOCTYPE
html
body
DOCTYPE
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>