Comment supprimer des lignes plus courtes que XY?

29

J'ai trouvé une question sur la façon de supprimer des lignes plus longues que 2048 caractères:

Comment supprimer une ligne si plus longue que XY?

Q: Mais comment supprimer des lignes plus courtes que 4 caractères? Supprimez donc les lignes qui ont 1 ou 2 ou 3 longueurs dans un fichier.

MISE À JOUR: Merci pour les nombreuses BONNES réponses, mais je ne peux en marquer qu'une comme OK

évachristine
la source

Réponses:

42

Vous pourriez utiliser sed. Ce qui suit supprimerait les lignes de 3 caractères ou moins:

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

Afin de sauvegarder les modifications du fichier sur place, fournissez l' -ioption.

Si votre version de sedne prend pas en charge la syntaxe RE étendue, vous pouvez écrire la même chose dans BRE:

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

qui fonctionnerait avec toutes les sedvariantes.


Vous pouvez également utiliser awk:

awk 'length($0)>3' filename

En utilisant perl:

perl -lne 'length()>3 && print' filename
devnull
la source
sed '/^.\{,3\}$/d'ne fonctionne pas avec BSD sed: sed: 1: "/^.\{,3\}$/d": RE error: invalid repetition count(s). La version sed -r est syntaxiquement valide, mais ne supprimera pas les lignes.
Dereckson
5

Quelques variantes supplémentaires:

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
Scrutinisateur
la source
1
Oh ce grep .... est si élégant!
grofte
3

Voici la solution Vim utilisant le mode Ex de Vim et la globalcommande.

Ceci est très similaire à l'utilisation sed, sauf que certains caractères spéciaux ('{', '}') doivent être échappés.

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

En utilisant le mode Very Magic Regex de Vim (\ v), cet échappement peut être évité.

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

Voir aussi: aidez la magie

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"

Parfois aussi, il est utile de faire le contraire avec vglobal.

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

supprimerait tout sauf les lignes jusqu'à 3 caractères.

gergap
la source
1

pour supprimer directement les lignes que vous pourriez:

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

Ou BRE:

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

Si une ligne ne contient pas 4 caractères ou plus, elle est supprimée.

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

Faire ce qui précède dans le sous-shell de substitution de commandes garantira que grepobtient un descripteur de lecture dessus avant que cat ne commence à y écrire, mais <<HEREDOCcela garantira également que le résultat reste diffusé et ne provoque pas d'erreurs de longueur d'argument.

mikeserv
la source
0
sed '/^.\?.\?.\?$/d' input.txt > output.txt
Hauke ​​Laging
la source
0

Vous pouvez utiliser grep:

Si vous comptez les espaces de début dans la longueur de ligne:

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

Si vous ne comptez pas les espaces de début dans la longueur de ligne:

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