Comment \ $ est-il interprété par grep?

12

Quand j'écris

$ grep \$  

alors tout ce que je tape sur le terminal est apparié et imprimé sur le terminal. Comment est \$interprété?

Happy Mittal
la source

Réponses:

18

Le shell interprète le \$et le transmet à grep as $, le caractère de fin de ligne. Donc, en supposant que votre ligne a une fin, elle correspondra à :-)

Si vous souhaitez faire correspondre un réel $dans grep, utilisez l'un des éléments suivants:

grep \\\$
grep '\$'

Dans le premier cas, le shell interprète \\comme \et \$comme $, donnant \$. Dans ce dernier, il ne l'interprète pas du tout.


Quant à votre question de savoir pourquoi \$correspond le signe dollar plutôt que la séquence de deux caractères, des expressions régulières comme celles utilisées dans l' greputilisation de caractères spéciaux à certaines fins. Certains d'entre eux sont:

$       end of line
^       start of line
.       any character
+       1 or more of the preceeding pattern
*       0 or more of the preceeding pattern
{n,m}   between n and m of the preceeding pattern
[x-y]   any character between x and y (such as [0-9] for a digit).

ainsi que beaucoup d'autres.

Lorsque vous souhaitez faire correspondre un caractère litre qui est normalement traité comme un caractère spécial, vous devez l'échapper afin qu'il greple traite comme le caractère normal.


la source
1
pour tester ce que voit grep, essayez echo \$puisecho \\$
Dans grep \\\ $, comme vous l'avez dit, \ $ est passé à grep donc il doit correspondre aux chaînes qui contiennent \ $, mais pourquoi correspond-il à la chaîne qui ne contient que $?
Parce que $ in grep signifie une fin de ligne. Pour faire correspondre le caractère $, vous devez l'échapper afin que grep ne le traite pas spécialement. Voir ma mise à jour.
@Pasi: echo fait son propre déséchapper, selon que ce soit une commande du shell ou non, conforme aux spécifications POSIX ou non, etc. Mieux est ( à mon humble avis) d'utiliser ls \$et de voir que nous obtenons « ls: $: Aucun fichier ou répertoire », pour voir que \ $ n'est pas échappé à $ mais \\ $ est non échappé à \ $, et ainsi de suite.
Henno
5

Le shell développe d'abord toutes les séquences d'échappement avant de passer les arguments au programme, donc il interprète le \$comme une séquence d'échappement et passe l'argument unique $à grep, qui correspond à la fin de la ligne. Étant donné que chaque ligne a une fin, toute ligne doit correspondre :)

Nick Meyer
la source
Mais comment est $ fin de ligne? La fin de ligne n'est-elle pas \ n?
2
@Happy Mithal: Voir man grep; il a été décidé que $correspond à la fin de la ligne, peu importe si oui ou non les lignes sont séparées par \n, \r, les deux, ou tout autre chose. Dans le cas général, les expressions régulières peuvent être utilisées pour faire correspondre n'importe quelle chaîne, pas seulement une «ligne», et $sont utilisées pour faire correspondre la fin de la chaîne.
2

Il est interprété comme le métacaractère de fin de ligne. Si vous souhaitez faire correspondre un signe dollar réel, faites

 $ grep \\$ 

ou

 $ grep '\$' 

la source
1

^est pour le début de la chaîne et $pour la fin.

grep \$

ou

grep $

correspondra à chaque chaîne, donc tout ce que vous tapez est renvoyé en écho.

Essayer

grep a$

Désormais, seules les chaînes dont le dernier caractère est amis en correspondance et en écho .

N 1.1
la source
1

Vous pouvez éviter de vous échapper si vous souhaitez rechercher un littéral $, en utilisant l'expression régulière de la classe de caractères. Par exemple,

$ grep '[$]' file
user31894
la source