web-dev-qa-db-fra.com

Comment supprimer toutes les lignes d'un fichier texte qui ont moins que des caractères 'X'?

Comment puis-je supprimer toutes les lignes d'un fichier texte qui ont moins que des lettres 'x' lettres OROR symboles? Je ne peux pas utiliser awk 'length($0)>' car il inclura des espaces.

8
Aeden Thomas

En supposant que vous souhaitez supprimer des lignes contenant moins de n symboles graphiques:

awk -v n=5 '{ line = $0; gsub("[^[:graph:]]", "") } length >= n { print line }'

Cela supprime tous les caractères qui ne correspondent pas [[:graph:]]. Si la longueur de la chaîne qui reste est supérieure ou égale à n, la ligne (non modifiée) est imprimée.

La valeur de n est donnée sur la ligne de commande.

[[:graph:]] est équivalent à [[:alnum:][:punct:]], qui est à son tour identique à [[:alpha:][:digit:][:punct:]]. Il est à peu près le même que [[:print:]] mais ne correspond pas aux espaces.

À la place de [^[:graph:]], vous pouvez éventuellement utiliser [[:blank:]] Pour supprimer tous les onglets ou les espaces.

Avec sed, en suivant ce qui précède awk code presque littéralement,

sed -e 'h; s/[^[:graph:]]//g' \
    -e '/.\{5\}/!d; g'

ou, simplifié (comptant uniquement des caractères non vierges),

sed -e 'h; s/[[:blank:]]//g' \
    -e '/...../!d; g'

Cela enregistre d'abord la ligne actuelle dans l'espace de maintien avec h. Il supprime ensuite tous les caractères non graphiques (ou caractères vides de la deuxième variante) sur la ligne avec s///g. Si la ligne contient ensuite moins de 5 caractères (changez-le sur le nombre de points souhaité ou modifiez le nombre de points dans la deuxième variante), la ligne est supprimée. Sinon, la ligne stockée est extraite de l'espace de maintien avec g et (implicitement) imprimé.

13
Kusalananda

Cela supprimera les lignes qui ont 10 caractères de 10 et moins de 10 caractères :

sed -E '/^.{1,11}$/d' filename

OR

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

Si vous souhaitez couper des espaces, vous pouvez utiliser:

sed -E 's/^[[:space:]]*//g;s/[[:space:]]*$//g;/^.{1,11}$/d' filename

Si vous voulez faire en place (directement dans le fichier) Supprimer l'utilisation - i option avec elle.

2

tilisation RAKU (Née Perl6)

raku -ne '.put if chars( S:g/\s// ) >= 10;'  filename

ou

raku -ne '.put unless chars( S:g/\s// ) < 10;'  filename

ou

raku -ne '.put unless chars( S:g/\W// ) < 10;'  filename

ou

raku -ne '.put unless chars( S:g/<ws>// ) < 10;'  filename

Brièvement, à Raku/Perl6, le "capital-s" S/// L'opérateur est utilisé pour générer une chaîne résultante dépourvu de caractères non désirés (espaces vides), les caractères de la chaîne résultante sont comptés avec la fonction chars, par rapport à "N" (en utilisant 10 à titre d'exemple). , et enfin - si le booléen est satisfait - .put retournera la ligne d'origine intacte.

NOTE 1: "S /// utilise la même sémantique que l'opérateur S ///, sauf qu'il laisse la chaîne d'origine intacte et renvoie la chaîne résultante au lieu de $/($/étant toujours défini sur les mêmes valeurs. Comme avec S /// /)."==

https://docs.raku.org/language/regexes#s///_non-destructive_substitution

Note 2: Dans les modificateurs Raku/Perl6 Regex comme :g (pour "global") sont appelés adverbes et sont (généralement) placés à la tête du S/// ou s/// Opérateur, juste après le S ou s.

Note 3: Le . DOT à Raku/Perl6 est utilisé pour appeler une méthode sur la variable de sujet $_, donc le premier "mot" du code .put est essentiellement sténographique pour $_.put.

https://docs.raku.org/language/5to6-nutshell#-%3e_method_calls

Note 4: Raku/Perl6 a un ensemble beaucoup plus restreint de drapeaux de ligne de commande. Les -e Flag ("Exécuter") exécute le code RAKU/PERL6 à la ligne de commande. Les -n Le drapeau exécute le code Raku/Perl6 en ligne, c'est-à-dire avec chaque ligne d'un fichier d'entrée une ligne à la fois, renvoyant un résultat. Les deux drapeaux peuvent être combinés dans un -ne Drapeau, mais peu importe, le -e le drapeau doit venir en dernier.

https://docs.raku.org/language/5to6-nutshell#command-line_flags
[.____] https://github.com/rakudo/rakudo/wiki/running-rakudo-from-the-command-line

1
jubilatious1