Considere meu humilde hello.html
arquivo, editado com poderoso ed:
$ ed hello.html
28
,p
<title>Hello world!</title>
Qual é a sua abordagem geral para editar dentro da tag HTML do título (bônus se você puder editar dentro de qualquer tag HTML)?
Tentei uma expressão regular que corresponda dentro da tag:
s/>.*/>My new title/p
<title>My new title
u
.
<title>Hello world!</title>
Mas, infelizmente, você pode ver que eu cortei minha tag (e seria muito trabalhoso digitar esse </title>
pedaço toda vez!).
Para obter mais informações, naveguei pela página Ferramentas de software em Pascal até 174 - consulte https://archive.org/details/softwaretoolsinp00kern/page/174/mode/1up?view=theater página - e descobri o &
caractere especial que chega de forma útil ao meio da frase:
s/world/& again/p
<title>Hello world again!</title>
Mas isso não está certo, já que quero substituir o meio, e não apenas chegar ao meio.
Você pode usar
[^<]
em vez de.
para corresponder a qualquer caractere diferente<
de qualquer caractere.Outra abordagem poderia ser inserir novas linhas antes e depois de cada coisa
<
que>
você deseja alterar em sua própria linha,c
com a qual você pode alternarc
:A melhor maneira é usar um analisador compatível com HTML e usá-lo para editar o conteúdo. Minha ferramenta preferida é
xmlstarlet
porque, embora seja um analisador/editor de XML, ela também pode lidar com HTML:Crie uma página de exemplo
Substituir
Hello world!
comHello everyone!
:A saída é gravada em stdout e a abordagem usual aqui é gravá-la em um arquivo temporário e depois substituir o original. Isso não é perfeito, mas provavelmente é aceitável:
Observe que se
$file
começar com-
você receberá errosxmlstarlet
e não poderá usá---
lo para separá-lo das opções verdadeiras. O que fazemos aqui é verificar se o nome do arquivo é absoluto e, caso contrário, acrescentamos./
. Você pode omitir acp
linha se não precisar salvar uma cópia do conteúdo original.Você não deve usar um regex para analisar HTML. Consulte https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags
Se você quiser fazer isso com
ed
o abaixo, faça-o para a tag HTML que você fornecer. Mas talvez seja melhor usarsed
. Isso funciona porque você pode usar qualquer caractere coms
, não precisa sers/old/new/
, pode sers|old|new|
ous!old!new!
.De https://www.gnu.org/software/sed/manual/html_node/The-_0022s_0022-Command.html