Est-il possible de trouver dans un fichier des lignes de plus de 79 caractères?
la source
Est-il possible de trouver dans un fichier des lignes de plus de 79 caractères?
Par ordre de vitesse décroissante (sur un système GNU dans une locale UTF-8 et sur une entrée ASCII) en fonction de mes tests:
grep '.\{80\}' file
perl -nle 'print if length$_>79' file
awk 'length>79' file
sed -n '/.\{80\}/p' file
Sauf pour les implémentations perl
¹ one (ou pour awk
/ grep
/ sed
(comme mawk
ou busybox) qui ne prennent pas en charge les caractères multi-octets), la longueur est comptée en nombre de caractères (en fonction du LC_CTYPE
paramètre d'environnement local) et non en octets .
S'il y a des octets dans l'entrée qui ne font pas partie de caractères valides (ce qui arrive parfois lorsque le jeu de caractères de l'environnement local est UTF-8 et que l'entrée est dans un codage différent), ces octets dépendent de l'implémentation de la solution et de l'outil. comptera pour 1 caractère, ou 0 ou ne correspondra pas .
.
Par exemple, une ligne composée de 30 a
octets 0x80, 30 b
s, un octet 0x81 et de 30 UTF-8 é
(codés en tant que 0xc3 0xa9) dans une locale UTF-8 ne correspond pas .\{80\}
à GNU grep
/ sed
(cet octet autonome 0x80). ne correspond pas .
), aurait une longueur de 30 + 1 + 30 + 1 + 2 * 30 = 122 avec perl
ou mawk
, 3 * 30 = 90 avec gawk
.
Si vous souhaitez compter en octets, corrigez les paramètres régionaux C
avec LC_ALL=C grep/awk/sed...
.
Cela aurait toutes les 4 solutions considérer que la ligne ci-dessus contient 122 caractères. Sauf dans perl
et dans les outils GNU, des problèmes pourraient subsister pour les lignes contenant des caractères NUL (octet 0x0).
¹ le perl
comportement peut être affecté par la PERL_UNICODE
variable d'environnement si
awk
peut venir plus près si vous laissez tomber($0)
, ce qui est implicite de toute façon;).^
, c'est un peu plus rapide: par exemplegrep '^.\{80\}' file
.grep '^.\{1000\}' file
retournegrep: invalid repetition count(s)
, tant queawk 'length>1000' file
réussit.)Approche Shell:
Approche Python:
Ou comme un court script pour la lisibilité:
Si nous voulions exclure le caractère
\n
de nouvelle ligne des calculs, nous pouvons faire enif len(line) > 79
sorte queif len(line.strip()) > 79
Note secondaire: il s'agit de la syntaxe Python 2.7. Utiliser
print()
pour Python 3la source