Como remover linhas menores que XY?

24

Eu encontrei uma pergunta sobre como remover linhas mais longas do que 2048 caracteres:

Como deletar linha se for maior que XY?

Q: Mas como posso remover linhas mais curtas que 4 caracteres? Portanto, remova as linhas que tenham 1 ou 2 ou 3 comprimentos em um arquivo.

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

    
por evachristine 05.04.2014 / 09:34

6 respostas

35

Você pode usar sed . O seguinte removeria linhas com 3 ou mais caracteres:

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

Para salvar as alterações no arquivo in-loco, forneça a opção -i .

Se a sua versão de sed não for compatível com a sintaxe RE estendida, você poderá escrever o mesmo em BRE:

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

que funcionaria com todas as variantes sed .

Você também pode usar awk :

awk 'length($0)>3' filename

Usando perl :

perl -lne 'length()>3 && print' filename
    
por 05.04.2014 / 09:38
3

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
    
por 06.04.2014 / 01:00
2

Aqui está a solução Vim usando o modo Ex do Vim e o comando global .

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

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

Usando o modo Very Magic Regex do Vim (\ v), esse escape pode ser evitado.

: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"

Às vezes, também é útil fazer o oposto com vglobal .

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

excluiria tudo, exceto linhas, até 3 caracteres.

    
por 01.07.2017 / 16:33
1

para remover diretamente as linhas que você poderia:

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 acima na subshell de substituição de comando irá garantir que grep obtenha um descritor lido antes que cat comece a gravar nele, mas o <<HEREDOC também assegurará que o resultado permaneça sendo transmitido e não cause erros de tamanho de argumento .

    
por 05.04.2014 / 11:02
0
sed '/^.\?.\?.\?$/d' input.txt > output.txt
    
por 05.04.2014 / 09:39
0

Você pode usar grep :

Se você contar os espaços iniciais em comprimento de linha:

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

Se você não conta os espaços iniciais em destaque:

grep -e '[^\]\{4,\}' file
    
por 05.04.2014 / 18:45