Como remover todas as tags HTML com sed?

4

Encontrei um ótimo tutorial explicando alguns exemplos práticos de sed .

O último (número 10) pode ser visto abaixo:

$ sed -e 's/<[^>]*>//g'
This <b> is </b> an <i>example</i>.
This  is  an example.

Alguém por favor pode me ajudar com isso?

Para resumir onde estou: 1. Entendo: s/x/y/g é um comando que diz ao sed para "subsituir globalmente o regex x com o regex y 2. Parece que o -e flag coloca sed em algum tipo de "modo interativo", da página man :

-e command
             Append the editing commands specified by the command argument to
             the list of commands.

Isso parece confuso para mim, porque não parece que estamos dando sed uma "lista de comandos", parece que estamos dando uma "lista de argumentos", então não tenho certeza aquele. 3. Entendo que o primeiro e único < é nada mais do que o único caractere regex < e o último > nada mais é do que o único caractere regex > 4. Eu entendo que o * está dizendo sed para corresponder 0 ou mais ocorrências do padrão antes dele, que é neste caso dentro dos colchetes; no entanto, isso é onde eu estou realmente confuso: alguém pode por favor descompactar o [^>]* mais para mim?

então, onde estou realmente confuso é:

  • o que está acontecendo com -e em inglês simples?
  • o que está acontecendo com [^>]* ?

Obrigado :)

    
por mbigras 01.09.2016 / 02:22

2 respostas

4

A sequência s/<[^>]*>//g é um comando para o mecanismo de processamento sed ; ele diz para fazer um "Search and replace". Portanto, -e 's/..../g' significa "adicione este comando de pesquisa e substituição à execução de sed .

Isso pode fazer mais sentido se fizermos vários comandos em um comando:

sed -e '1d' -e '$d'

adicionaria dois comandos ao processamento sed ; "delete first line" e "delete last line".

O [^>] é uma expressão regular que significa "qualquer caractere, exceto o >

Portanto, [^>]* significa "zero ou mais de qualquer caractere, exceto o >

E assim, <[^>]*> significa < , seguido opcionalmente por não > , seguido por > .

E então colocamos isso em um comando "search and replace" onde essa sequência é substituída por nada, e então faz várias vezes na linha (o% finalg).

Isso significa que a string hello <abc> there <def> coincidirá primeiro com <abc> (o < , depois abc corresponde a "zero ou mais não > ", depois o > ) e substitui isso por nada e, em seguida, refaça isso para o <def> . O resultado seria hello there .

(observe os espaços extras, porque não os estamos removendo!)

    
por 01.09.2016 / 02:30
2

Limitando o escopo aos dois pontos:

  • O -e informa sed que existe um comando de edição após

  • O [^>]* é um padrão que corresponde a zero ou mais caracteres que podem ser "qualquer coisa", exceto o caractere >

e o comando de edição diz

's/<[^>]*>//g'

altere qualquer coisa que corresponda a < , seguida por qualquer número de caracteres até o primeiro > para nada . E faça isso quantas vezes houver.

    
por 01.09.2016 / 02:27