web-dev-qa-db-fra.com

Comment utiliser grep pour obtenir quelque chose juste après `name =`?

Je suis coincé en essayant de faire quoi que ce soit juste après name=, n'inclut que les espaces et les caractères alphanumériques.

par exemple.:

name=some value here

Je reçois

some value here

Je suis totalement nouveau dans ce domaine, le grep suivant correspond à tout, y compris le name=.

grep 'name=.*' filename

Toute aide est très appréciée.

57
ngaame

Comme détaillé ici , vous voulez une clause positive lookbehind, telle que:

grep -P '(?<=name=)[ A-Za-z0-9]*' filename

Le -P oblige grep à utiliser le dialecte Perl, sinon vous auriez probablement besoin d'échapper aux parenthèses. Vous pouvez également, comme indiqué ailleurs, ajouter le -o paramètre pour imprimer uniquement ce qui correspond. La partie entre parenthèses spécifie que vous voulez des alphanumériques et des espaces.

L'avantage d'utiliser une clause lookbehind positive est que le texte "name =" ne fait pas partie de la correspondance. Si grep met en surbrillance le texte correspondant, il ne mettra en surbrillance que la partie alphanumérique (et les espaces). Le paramètre -o n'affichera pas non plus la partie "name =". Et, si vous faites la transition vers un autre programme comme sed qui pourrait capturer le texte et faire quelque chose avec lui, vous ne capturerez pas la partie "name =", bien que vous puissiez également le faire en utilisant la capture parenthess.

102
markets

Essaye ça:

sed -n 's/^name=//p' filename

Il indique à sed de ne rien imprimer (-n) par défaut, de remplacer votre préfixe par rien et d'imprimer si la substitution se produit.

Bonus: si vous en avez vraiment besoin pour ne faire correspondre que les entrées avec uniquement des espaces et des caractères alphanumériques, vous pouvez aussi le faire:

sed -n 's/^name=\([ 0-9a-zA-Z]*$\)/\1/p' filename

Ici, nous avons ajouté un modèle pour faire correspondre les espaces et les caractères alphanumériques uniquement jusqu'à la fin de la ligne ($), et si nous faisons correspondre, nous substituons le groupe entre parenthèses et imprimons.

22
John Zwinck

grep n'extrait pas comme prévu. Ce dont vous avez besoin c'est

grep "name=" file.txt | cut -d'=' -f1-
4
Stefano Borini

grep imprimera la ligne entière là où elle correspond au motif. Pour imprimer uniquement le motif correspondant, utilisez l'option grep -o. Vous devrez probablement également utiliser sed pour supprimer la partie name = du motif.

grep -o 'name=[0-9a-zA-Z ]'  myfile | sed /^name=/d
1
Charles Ma