Comment puis-je supprimer une ligne si elle est plus longue que par exemple: 2048 caractères?
Comment puis-je supprimer une ligne si elle est plus longue que par exemple: 2048 caractères?
Réponses:
sed '/^.\{2048\}./d' input.txt > output.txt
sed: 1: "/^.\{2048\}..*/d": RE error: invalid repetition count(s)
(Mac OS X)
Voici une solution qui supprime les lignes de 2049 caractères ou plus:
sed -E '/.{2049}/d' <file.in >file.out
L'expression /.{2049}/d
correspondra à toute ligne contenant au moins 2049 caractères et les supprimera de l'entrée, ne produisant qu'une ligne plus courte sur la sortie.
Avec awk
, lignes d'impression d'une longueur égale ou inférieure à 2048:
awk 'length <= 2048' <file.in >file.out
Imitant la sed
solution littéralement avec awk
:
awk 'length >= 2049 { next } { print }' <file.in >file.out
sed: 1: "/^.\{400,\}$/d": RE error: invalid repetition count(s)
(Mac OS X)
Quelque chose comme ça devrait fonctionner en Python.
of = open("orig")
nf = open("new",'w')
for line in of:
if len(line) < 2048:
nf.write(line)
of.close()
nf.close()
perl -lne "length < 2048 && print" infile > outfile
-l
n'est cependant pas nécessaire.
Warning: Use of "length" without parentheses is ambiguous at -e line 1. Unterminated <> operator at -e line 1.
length($_) > 2048 && print
. length
est un raccourci de length($_)
toute façon.
Les réponses ci-dessus ne fonctionnent pas pour moi sur Mac OS X 10.9.5.
Le code suivant fonctionne:
sed '/.\{2048\}/d'
.
Bien que non demandé, mais fourni à titre de référence, l'inverse peut être obtenu avec le code suivant:
sed '/.\{2048\}/!d'
.
sed: 1: "/.\{2048\}/d": RE error: invalid repetition count(s)
( Mac OS X, 10.10.4
)
Avec gnu-sed, vous pouvez utiliser l'indicateur -r, pour éviter de taper les barres obliques inverses et une virgule, pour définir un intervalle ouvert:
sed -r "/.{2049,}/d" input.txt > output.txt
avec:
Pour les intervalles, pour ne pas correspondre à des motifs plus grands, vous auriez besoin d'ancrages de ligne comme
sed -r "/^.{32,64}$/d" input.txt > output.txt