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