web-dev-qa-db-fra.com

Comment supprimer des lignes plus courtes que XY?

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

33
evachristine

Vous pouvez 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 le -i option.

Si votre version de sed ne 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 variantes de sed.


Vous pouvez également utiliser awk:

awk 'length($0)>3' filename

Utilisation de Perl:

Perl -lne 'length()>3 && print' filename
44
devnull

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
6
Scrutinizer

Voici la solution Vim utilisant le mode Ex de Vim et la commande global.

Ceci est très similaire à l'utilisation de sed, seulement 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 utile est de faire le contraire avec vglobal.

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

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

3
gergap

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 commande garantira que grep obtient un descripteur de lecture dessus avant que cat ne commence à y écrire, mais le <<HEREDOC garantira également que le résultat reste diffusé et ne provoque pas d'erreurs de longueur d'argument.

1
mikeserv

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