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?

Paweł Jaworowski
la source
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
unix.stackexchange.com/questions/60994/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

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
Matteo
la source
@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
jimmij
la source
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.

mikeserv
la source
@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