AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 768628
Accepted
mbigras
mbigras
Asked: 2024-02-06 14:22:21 +0800 CST2024-02-06 14:22:21 +0800 CST 2024-02-06 14:22:21 +0800 CST

Edite dentro de uma tag HTML com ed(1)

  • 772

Considere meu humilde hello.htmlarquivo, 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.

regular-expression
  • 3 3 respostas
  • 58 Views

3 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2024-02-06T15:35:07+08:002024-02-06T15:35:07+08:00

    Você pode usar [^<]em vez de .para corresponder a qualquer caractere diferente <de qualquer caractere.

    28
    ed> ,n
    1       <title>Hello world!</title>
    ed> s/>[^<]*/>new title/
    ed> ,n
    1       <title>new title</title>
    

    Outra abordagem poderia ser inserir novas linhas antes e depois de cada coisa <que >você deseja alterar em sua própria linha, ccom a qual você pode alternar c:

    28
    ed> ,n
    1       <title>Hello world!</title>
    ed> s/[<>]/\
    &\
    /g
    ed> ,n
    1
    2       <
    3       title
    4       >
    5       Hello world!
    6       <
    7       /title
    8       >
    9
    ed> 5c
    new title
    .
    ed> ,n
    1
    2       <
    3       title
    4       >
    5       new title
    6       <
    7       /title
    8       >
    9
    ed> 1,9j
    ed> ,n
    1       <title>new title</title>
    
    • 2
  2. Chris Davies
    2024-02-06T18:41:50+08:002024-02-06T18:41:50+08:00

    A melhor maneira é usar um analisador compatível com HTML e usá-lo para editar o conteúdo. Minha ferramenta preferida é xmlstarletporque, embora seja um analisador/editor de XML, ela também pode lidar com HTML:

    Crie uma página de exemplo

    cat >my.html <<'EOF'
    <html>
    <title>Hello world!</title>
    <body><p>Thank you for reading my page</p></body>
    </html>
    EOF
    

    Substituir Hello world!com Hello everyone!:

    xmlstarlet format --html my.html 2>/dev/null |
        xmlstarlet edit --omit-decl --update '//title' --value 'Hello everyone!'
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
    <html>
      <head>
        <title>Hello everyone!</title>
      </head>
      <body>
        <p>Thank you for reading my page</p>
      </body>
    </html>
    

    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:

    file=my.html
    (
        [ "${file#/}" = "$file" ] && file="./$file"
    
        xmlstarlet format --html "$file" 2>/dev/null |
            xmlstarlet edit --omit-decl --update '//title' --value 'Hello everyone!' >"$file.tmp" &&
            cp -p -- "$file" "$file.old" &&
            mv -f -- "$file.tmp" "$file"
    )
    

    Observe que se $filecomeçar com -você receberá erros xmlstarlete 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 a cplinha se não precisar salvar uma cópia do conteúdo original.

    • 2
  3. Mark McKinstry
    2024-02-06T14:38:51+08:002024-02-06T14:38:51+08:00

    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 edo abaixo, faça-o para a tag HTML que você fornecer. Mas talvez seja melhor usar sed. Isso funciona porque você pode usar qualquer caractere com s, não precisa ser s/old/new/, pode ser s|old|new|ou s!old!new!.

    $ ed hello.html
    28
    ,p
    <title>Hello world!</title>
    s|<title>.*</title>|<title>foo</title>|
    ,p
    <title>foo</title>
    

    Os caracteres / podem ser substituídos uniformemente por qualquer outro caractere único em qualquer comando s. O caractere / (ou qualquer outro caractere usado em seu lugar) pode aparecer na expressão regular ou na substituição somente se for precedido por um caractere \.

    De https://www.gnu.org/software/sed/manual/html_node/The-_0022s_0022-Command.html

    • 1

relate perguntas

  • Como remover alguns caracteres após uma partida?

  • Processe arquivos Unicode com BOM corretamente com ferramentas POSIX

  • Por que a expressão regular não corresponde à entrada com o comando sed [duplicado]

  • Converter senha com caracteres especiais para uso com script esperado

  • menos: várias condições de filtro com AND

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve