Quand j'écris
$ grep \$
alors tout ce que je tape sur le terminal est apparié et imprimé sur le terminal. Comment est \$
interprété?
Quand j'écris
$ grep \$
alors tout ce que je tape sur le terminal est apparié et imprimé sur le terminal. Comment est \$
interprété?
Réponses:
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' grep
utilisation 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 grep
le traite comme le caractère normal.
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.
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 :)
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.
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 '\$'
echo \$
puisecho \\$