web-dev-qa-db-fra.com

Comment puis-je grep pour une chaîne qui commence par un tiret / trait d'union?

Je veux grep pour la chaîne qui commence par un tiret/trait d'union, comme -X, dans un fichier, mais cela confond en tant qu'argument de ligne de commande.

J'ai essayé:

grep "-X"
grep \-X
grep '-X'
297
Mike

Utilisation:

grep -- -X

Connexes: Que signifie un double tiret nu? (grâce à idiot à propos de natty ).

396
newacct

Le tiret est un caractère spécial dans Bash, comme indiqué à l’adresse http://tldp.org/LDP/abs/html/special-chars.html#DASHREF . Donc, échapper à cette occasion vous permet de dépasser Bash, mais Grep a toujours sa propre signification pour les tirets (en fournissant des options).

Vous devez donc vraiment y échapper deux fois (si vous préférez ne pas utiliser les autres réponses mentionnées). Ce qui suit/devrait fonctionner

grep \\-X
grep '\-X'
grep "\-X"

Une façon d'essayer de voir comment Bash transmet les arguments à un script/programme consiste à créer un script .sh qui ne fait qu'échouer tous les arguments. J'utilise un script appelé echo-args.sh pour jouer de temps en temps, tout ce qu'il contient est:

echo $*

Je l'invoque comme:

bash echo-args.sh \-X
bash echo-args.sh \\-X
bash echo-args.sh "\-X"

Vous avez eu l'idée.

50
Chad Gorshing

grep -e -X fera l'affaire.

24
Thomas
grep -- -X
grep \\-X
grep '\-X'
grep "\-X"
grep -e -X
grep [-]X
17
John Henry

Je n'ai pas accès à une machine Solaris, mais grep "\-X" fonctionne pour moi sur Linux.

7
ezpz

La bonne façon serait d'utiliser "-" pour arrêter le traitement des arguments, comme déjà mentionné. Cela est dû à l'utilisation de getopt_long (fonction C GNU de getopt.h) dans la source de l'outil.

C'est pourquoi vous remarquez le même phénomène sur d'autres outils en ligne de commande; étant donné que la plupart d'entre eux sont des outils GNU et utilisent cet appel, ils présentent le même comportement.

En guise de remarque - getopt_long est ce qui nous donne le choix judicieux entre -rlo et --really_long_option et la combinaison d'arguments dans l'interpréteur.

5
fmmarques

Si vous utilisez un autre utilitaire qui transmet un seul argument à grep, vous pouvez utiliser:

'[-]X'
3
Colin vH

vous pouvez utiliser nawk

$ nawk '/-X/{print}' file
2
ghostdog74