472 votes

Comment puis-je rechercher une chaîne de caractères qui commence par un tiret/hyphène ?

Je veux rechercher la chaîne qui commence par un tiret/hyphène, comme suit -X dans un fichier, mais il le confond avec un argument de ligne de commande.

J'ai essayé :

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

628voto

newacct Points 42530

Utilisez :

grep -- -X

En rapport : Que signifie un double tiret nu ? (merci à à propos de natty ).

76 votes

Pour ceux d'entre nous qui se demandent à ce stade ce que -- signifie ou fait : unix.stackexchange.com/questions/11376/

2 votes

Fonctionne également avec The Silver Searcher (ag).

0 votes

Si vous voulez utiliser une variable comportant des espaces, vous devez utiliser quelque chose comme ceci : ARGS="-a -b -c" grep -- "$ARGS"

71voto

Chad Gorshing Points 999

Le tiret est un caractère spécial dans Bash, comme indiqué à l'adresse suivante http://tldp.org/LDP/abs/html/special-chars.html#DASHREF . Ainsi, l'échappement de ces caractères vous permet de passer outre 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). Les réponses suivantes fonctionneront/devraient fonctionner

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

Une façon d'essayer comment Bash passe les arguments à un script/programme est de créer un script .sh qui ne fait qu'échouer tous les arguments. J'utilise un script appelé echo-args.sh pour jouer avec 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 voyez l'idée.

3 votes

Je ne pense pas que - soit un caractère spécial dans Bash, malgré ce que dit le guide ABS. Bash ne traite pas les arguments commençant par - différemment des autres. La commande ou le module intégré que Bash appelle ensuite traitera les arguments commençant par un tiret comme bon lui semble. La plupart des modules intégrés de Bash et des commandes Linux et GNU traitent -- comme un terminateur d'option. Utilisez 'set -x' pour voir les commandes et les arguments que Bash utilise avant qu'ils ne soient exécutés, mais après que Bash ait étendu les échappements, les globes et les accolades. Grep est un exemple déroutant car il gère lui-même les échappements de barres obliques inversées.

36voto

Thomas Points 63635

grep -e -X fera l'affaire.

1 votes

Mon grep n'a pas de -e, très bizarre

2 votes

Disponible sur solaris à partir de /usr/xpg4/bin/grep, btw. Beaucoup d'utilitaires plus complets dans ce répertoire.

0 votes

Il a fonctionné sous MinGW ( MinGW ne prend pas en charge -P (mais c'est une autre histoire et cela ne s'applique pas ici)).

8voto

ezpz Points 5273

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

5voto

user2486650 Points 21

La manière correcte serait d'utiliser "--" pour arrêter de traiter les arguments, comme déjà mentionné. Ceci est dû à l'utilisation de getopt_long (fonction C GNU de getopt.h) dans les sources de l'outil.

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

A propos - getopt_long est ce qui nous donne le choix cool entre -rlo et --really_long_option et la combinaison des arguments dans l'interpréteur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X