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'
Utilisation:
grep -- -X
Connexes: Que signifie un double tiret nu? (grâce à idiot à propos de natty ).
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.
grep -e -X
fera l'affaire.
grep -- -X
grep \\-X
grep '\-X'
grep "\-X"
grep -e -X
grep [-]X
Je n'ai pas accès à une machine Solaris, mais grep "\-X"
fonctionne pour moi sur Linux.
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.
Si vous utilisez un autre utilitaire qui transmet un seul argument à grep, vous pouvez utiliser:
'[-]X'
vous pouvez utiliser nawk
$ nawk '/-X/{print}' file