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

12

Eu tenho um arquivo html. Quero remover todas as linhas que não começam <tr>.

Eu tentei:

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

mas excluiu todas as linhas.

Michael Durrant
fonte
3
Mais fácil com grep.
Jcbermu
1
s/^[^tr]...corresponde a linhas que começam com qualquer caractere que não seja tou r. Os colchetes são um intervalo de caracteres em uma regex.
22615 Peter Cordes

Respostas:

18

Tente isso com o GNU sed:

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

ou

sed '/^<tr>/!d' file
Cyrus
fonte
1
Acho a versão !dparticularmente útil porque permite que você escreva outro comando sed dentro da expressão, enquanto o púnico imprime a correspondência, mas o comando seguinte tem a entrada não carregada.
jirislav
9
sed -e '/^<tr>/d'

A parte entre /é uma regex. O dcomando exclui linhas correspondentes.

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

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

Onde !nega o sentido da partida.

user3188445
fonte
3

Se for necessário sed:

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

-iedita o arquivo no local, -nevita seda impressão de todas as linhas, a expressão regular significa corresponder a todas as linhas que começam com ( ^) <tr>e essas linhas serão impressas ( p).

Com grep:

grep -E '^<tr>' file

Com -Egrep interpreta expressões regulares estendidas.

Com awk:

awk '/^<tr>/' file

Ou puro bash:

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

A [[expressão condicional interna é bashs. Comparamos $lcom a expressão regular e, se for bem-sucedida ( &&), imprimimos a linha com echo.

caos
fonte
Sua versão pure-bash falha ao citar "$l". E você está colocando isso como o primeiro argumento na echolinha de comando, então você terá um problema se começar com a -option. (Use printf '%s\n' "$l"). Also, shell read` tem que ler um byte-a-um-tempo, por isso é super lento arquivos de texto de processamento em festa pura geralmente não é uma boa escolha se você não sabe o seu arquivo é muito pequeno..
Peter Cordes
2

A resposta mais fácil e simples seria:

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

Isso imprimirá o arquivo apenas com as linhas que começam com as que poderiam ser boas se você não quiser modificar o arquivo diretamente (como no sed).

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

Nesse caso, você economiza um pouco de backup do arquivo antes de tentar alguns comandos.

VaTo
fonte