Embora isso vá contra o meu melhor julgamento, vou postá-lo ( sed
part).
Isto é: se for por uma solução rápida e suja, vá em frente. Se for um pouco mais sério ou algo que você vai fazer com freqüência etc. Use outra coisa como python, perl etc., onde você não depende de expressões regulares, mas de módulos para manipular documentos HTML.
Uma das maneiras mais simples seria usar, e. sed.
sed 's/\(<[^>]*\) \+id="[^"]*"\([^>]*>\)//' sample.html > noid.html
Explicado:
+--------------------------------- Match group 1
| +---------- Match group 2
___|___ ___|___
| | | |
sed 's/\(<[^>]*\) \+id="[^"]*"\([^>]*>\)//' sample.html > noid.html
| | | | | | | || | | |
| | | | | | | || | | +- 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
Use sed -i
para editar o arquivo no lugar. (Lamenta possível, mas não desfazer.)
Melhor; exemplo usando 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;
}
Seu comando grep não corresponderia a nada. Mas como você usa a opção invertida -v
it
imprime tudo que não corresponde - assim, o arquivo inteiro.
O grep não é um modificador de arquivos no local , mas normalmente é uma ferramenta para encontrar coisas em arquivo (s). Tente, por exemplo:
grep -o '\(<[^>]*\)id="[^"]*"[^>]*>' sample.html
-o
significa imprimir apenas o padrão de correspondência. (Não linha inteira)
sed
, awk
etc. são geralmente usados para editar fluxos ou arquivos. Por exemplo. como pelo exemplo acima.
Do seu grep há algumas concepções erradas:
id\="[a-zA-Z][0-9]"
Corresponderia exatamente:
-
id=
-
Um caractere no intervalo
a-z
ouA-Z
- Seguido por um dígito único
Em outras palavras, corresponderia:
id="a0"
id="a1"
id="a2"
...
id="Z9"
Nada como: id="foo99"
ou id="blah-gah"
.
Além disso, corresponderia:
^ <-- 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)
Assim, nada.