Je veux grep lignes contenant
- 0 amount - 122,000,000 amount - 50,000 amount
J'ai essayé d'utiliser
grep -rhI " - * amount ".
mais il sortira tout ce qui contient
-
peu importe qu'il contienne
amount
Le problème est que je ne veux que des strings avec
- * amount
où *
indique quelque chose entre - (here) amount
. Il est acceptable que les lignes contenant uniquement "-" soient rejetées.
Mais ça ne marche pas.
Le *
correspondra à zéro ou plus du caractère ou du motif précédent .
Cela signifie que - * amount
correspondra
- amount
- amount
- amount
Pour faire correspondre les nombres, comme vous les avez écrits, utilisez - [0-9,]+ amount
comme motif. Le +
va forcer au less une correspondance de l'expression régulière précédente, et [0-9,]
correspondra à n'importe quel chiffre ou une virgule.
Compte tenu du file suivant:
- 0 amount - 122,000,000 amount - 50,000 amount - amount - amount - some amount
Cela fonctionnera:
$ grep -E -- '- [0-9,]+ amount' file - 0 amount - 122,000,000 amount - 50,000 amount
Le -E
est nécessaire parce que +
est une expression régulière étendue, et le --
est nécessaire car sinon le -
dans le pattern serait interprété comme une option à grep
(double tiret signale la fin des options de la command line).
Vous pouvez également ancrer le motif au début et à la fin de la ligne:
$ grep -E '^ - [0-9,]+ amount$' file
Cela signifie que le --
n'est plus nécessaire et veillera à ce que la ligne commence par un espace suivi du tiret et du numéro, etc. comme précédemment. La amount
string doit être la dernière chose sur la ligne.
Quelque chose comme peut faire le travail (avec le script awk, searchr le 1er token à être tiret et le 3ème à être la string "montant"):
awk '$1=="-" && $3=="amount" {print $2}'
Si vous voulez que la ligne entière soit imprimée, utilisez quelque chose comme:
awk '$1=="-" && $3=="amount" {print}'
Vous pourriez aussi utiliser
grep -rhI -- '- [^ ]* amount' /path/to/parent/dir/*
où [^ ]*
correspond à n'importe quel nombre de caractères sauf un espace.