Grep toutes les chaînes qui ne commencent pas par des nombres


10

Je cherche grep pour montrer tous les caractères qui ne commencent pas par des nombres. J'ai fait quelque chose comme ça:

grep -v '^[1-2]*[a-zA-Z]?' -o

mais ça ne marche pas. Avez-vous une idée pour une exp reg?


1
Utiliser -vavec -oprovoquer grepne produit aucune sortie.
cuonglm

Qu'entendez-vous par montrer tous les personnages ? Vous voulez dire des lignes qui ne commencent pas par des nombres, ou voulez-vous supprimer tous les nombres de l'entrée?
Matteo

Par défaut, greputilise des expressions régulières de base . Cela signifie que votre ?est traité comme un point d'interrogation littéral. Soit échapper au point d'interrogation \?, soit utiliser l' -Eoption pour extendedles expressions régulières, auquel cas il ?s'agit d'un caractère de modèle.
Peter.O

Réponses:


22

grep -v '^[0-9]'

Sortira toutes les lignes qui ne correspondent pas -vaux lignes commençant ^par un nombre[0-9]

Par exemple

$ cat test
string
string123
123string
1string2
$ grep -v '^[0-9]' test
string
string123

ou si vous souhaitez supprimer tous les mots commençant par un chiffre

sed 's/[[:<:]][[:digit:]][[:alnum:]_]*[[:>:]]//g'

ou avec des raccourcis et des assertions

sed 's/\<\d\w*\>//g'

Par exemple

$ cat test
one
two2
3three
4four4
five six
seven 8eight
9nine ten
11eleven 12twelve
a b c d
$ sed 's/[[:<:]][[:digit:]][[:alnum:]_]*[[:>:]]//g' test
one
two2


five six
seven 
 ten

a b c d

@mikeserv pourquoi? Il supprime chaque mot commençant par un chiffre (comme peut-être demandé dans la question d'origine)
Matteo

1
Non ça marche. Fin sous OS X (et peut-être d'autres BSD) \> et \ <ne fonctionnent pas. Pour cette raison, j'ai mentionné les deux versions. Et j'ai dû utiliser le laid sur ma machine pour l'exemple.
Matteo

Depuis la page de manuel \> Matches the null string at the end of a word. This is equivalent to [[:>:]] '.'
Matteo

3

Cela dépend de la façon dont vous définissez une chaîne (par exemple, si vous comptez les caractères de ponctuation dans la chaîne ou non). Néanmoins, vous pouvez commencer par quelque chose comme

grep -Po '\b[^[:digit:]].*?\b' file

2

Pour supprimer tous les mots d'une ligne commençant par un nombre, sedvous pouvez procéder comme suit:

sed 'x;s/.*//;G
     s/[[:space:]][[:punct:]]\{0,1\}[0-9][^[:space:]]*//g
     s/\n//'

... ou, si vous vouliez uniquement des mots qui ne commencent pas par des chiffres imprimés chacun sur une ligne distincte:

sed 'y/!\t "'"'?/\n\n\n\n\n\n/;/^[_[:alpha:]]/P;D"

... ce qui précède devrait assez bien fonctionner. Vous voudrez adapter la traduction \newline y///pour les séparateurs que vous jugez pertinents. Et, seden fonction de l'implémentation, vous voudrez peut-être également un véritable <tab>remplacement de la \tbarre oblique inverse.


@don_crissti - Oh, oui - je mettrai cela en !avant du '"'swap, mais si vous utilisez, bashvous voudrez peut-être set +Hou si zshalors set -K. À mon avis, toute !expansion citée est une folie. Vous pouvez également utiliser des heredocs comme "${0#-}" <<\CMD\nyour cmd strings\nCMD\npour obtenir un comportement scripté dans des shells interactifs.
mikeserv

Merci pour l' "${0#-}" <<...astuce!
don_crissti

@don_crissti - Si vous utilisez, "${0#-}" -s -- arg list <<\CMD\n...vous pouvez également définir les paramètres de position lors de l'invocation. Utiliser "$@"ou *me sert souvent à la place de arg list. Et avec ln -s "$(command -v "${0#-}")" /tmp/new_name; cd tmp; new_name <<\CMD\n...vous, vous pouvez obtenir un nouveau $0stdin.
mikeserv
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.