Como remover linhas menores que XY?


29

Encontrei uma pergunta sobre como remover linhas com mais de 2048 caracteres:

Como excluir uma linha se for maior que XY?

P: Mas como posso remover linhas menores que 4 caracteres? Portanto, remova as linhas com 1 ou 2 ou 3 de comprimento em um arquivo.

ATUALIZAÇÃO: Obrigado pelas muitas respostas BOAS, mas só posso marcar uma como OK

Respostas:


42

Você poderia usar sed. O seguinte removeria linhas com 3 caracteres ou menos:

sed -r '/^.{,3}$/d' filename

Para salvar as alterações no arquivo no local, forneça a -iopção

Se a sua versão do sednão suportar sintaxe RE estendida, você poderá escrever o mesmo no BRE:

sed '/^.\{,3\}$/d' filename

o que funcionaria com todas as sedvariantes.


Você também pode usar awk:

awk 'length($0)>3' filename

Usando perl:

perl -lne 'length()>3 && print' filename

sed '/^.\{,3\}$/d'não funciona com BSD sed: sed: 1: "/^.\{,3\}$/d": RE error: invalid repetition count(s). A versão sed -r é sintaticamente válida, mas não remove linhas.
Dereckson

5

Mais algumas variações:

grep .... file

ou

sed '/..../!d' file

ou

sed -n 's/./&/4p' file

ou

awk 'gsub(/./,"&")>3' file

ou

awk 'length>3' file

ou GNU awk:

awk 'NF>3' FS= file

1
Oh que grep .... é tão elegante!
grofte

3

Aqui está a solução Vim usando o modo Ex do Vim e o globalcomando

Isso é muito semelhante ao uso sed, apenas que alguns caracteres especiais ('{', '}') precisam ser escapados.

:g/^.\{,3\}$/d

Usando o modo Very Magic Regex do Vim (\ v), essa fuga pode ser evitada.

:g/\v^.{,3}$/d

Veja também: ajuda mágica

Use of "\v" means that in the pattern after it all ASCII characters except
'0'-'9', 'a'-'z', 'A'-'Z' and '_' have a special meaning.  "very magic"

Também às vezes útil é fazer o oposto com vglobal.

:v/\v^.{,3}$/d

excluiria tudo, menos as linhas até 3 caracteres.


1

para remover diretamente as linhas que você pode:

sed -ri '/.{4}/!d' /path/to/file

Ou BRE:

sed -i '/.\{4\}/!d' /path/to/file

Se uma linha não contiver 4 ou mais caracteres, ela será excluída.

f=/path/to/file
cat <<GREP >"$f"
    $(grep -E ".{4}" "$f")
GREP

Fazer o descrito acima no subshell de substituição de comando garantirá a grepobtenção de um descritor de leitura antes que o gato comece a gravá-lo, mas <<HEREDOCtambém garantirá que o resultado permaneça transmitido e não cause erros de comprimento de argumento.



0

Você pode usar grep:

Se você contar espaços à esquerda no comprimento da linha:

grep -e '[^\ ]\{4,\}' file

Se você não contar espaços à esquerda na linha magra:

grep -e '[^\]\{4,\}' file
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.