sed - como remover todas as linhas que não correspondem

5

Eu tenho um arquivo html. Desejo remover todas as linhas que não iniciam com <tr> .

Eu tentei:

cat my_file | sed $'
s/^[^tr].*//
' | sed '/^$/d'

mas excluiu todas as linhas.

    
por Michael Durrant 18.08.2015 / 10:48

4 respostas

7

Tente isso com o GNU sed:

sed -n '/^<tr>/p' file

ou

sed '/^<tr>/!d' file
    
por 18.08.2015 / 10:52
3
sed -e '/^<tr>/d'

A parte entre / é uma regex. O comando d exclui as linhas correspondentes.

Atualização: oops, desculpe, eu vi você disse NÃO. Então

sed -e '/^<tr>/!d'

Onde ! nega o sentido da correspondência.

    
por 18.08.2015 / 10:52
2

Se tiver que ser sed :

sed -ni '/^<tr>/p' file

-i edita o arquivo no local, -n evita sed imprimir todas as linhas, a expressão regular significa corresponder a todas as linhas que iniciam ( ^ ) com <tr> e essas linhas serão impressas ( p ).

com grep :

grep -E '^<tr>' file

Com -E grep interpreta expressões regulares estendidas.

com awk :

awk '/^<tr>/' file

Ou bash :

puro
while IFS= read -r l; do [[ "$l" =~ ^\<tr\> ]] && echo $l; done <file

A expressão condicional interna [[ é bashs. Comparamos $l com a expressão regular e, se tivermos sucesso ( && ), imprimimos a linha com echo .

    
por 18.08.2015 / 11:33
1

A resposta mais fácil e simples seria:

grep '^<tr>' path/to/file 

Isto irá imprimir o arquivo com apenas as linhas que começam com o que poderia ser bom se você não quiser modificar o arquivo diretamente (como com o sed).

Então, se você gosta do que vê na saída, basta imprimir em um arquivo com > file

Nesse caso, você economiza tempo fazendo backup do arquivo antes de tentar alguns comandos.

    
por 18.08.2015 / 18:37