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>