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

evacristina
fonte

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
devnull
fonte
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
Scrutinizer
fonte
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.

gergap
fonte
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.

mikeserv
fonte
0
sed '/^.\?.\?.\?$/d' input.txt > output.txt
Hauke ​​Laging
fonte
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
cuonglm
fonte