web-dev-qa-db-fra.com

Lorsque grep "\\" XXFile j'ai obtenu "Trailing Backslash"

Maintenant, je veux savoir s'il y a des lignes contenant le caractère '\'. J'ai essayé grep "\\" XXFile mais il indique "Trailing Backslash". Mais quand j'ai essayé grep '\\' XXFile c'est bon. Quelqu'un pourrait-il expliquer pourquoi le premier cas ne peut pas s'exécuter? Merci.

58
dong

La différence réside dans la façon dont le shell traite les barres obliques inverses:

  • Lorsque vous écrivez "\\" entre guillemets, le shell interprète l'échappement de la barre oblique inverse et finit par passer la chaîne \ à grep. Grep voit alors une barre oblique inverse sans caractère suivant, il émet donc un avertissement de "barre oblique inversée". Si vous souhaitez utiliser des guillemets doubles, vous devez appliquer deux niveaux d'échappement, un pour le shell et un pour grep. Le résultat: "\\\\".

  • Lorsque vous écrivez '\\' entre guillemets simples, le Shell fait pas faire n'importe quelle interprétation, ce qui signifie que grep reçoit la chaîne \\ avec les deux barres obliques inversées intactes. Grep interprète cela comme une barre oblique inversée, il recherche donc dans le fichier un caractère littéral de barre oblique inversée.

Si ce n'est pas clair, nous pouvons utiliser echo pour voir exactement ce que fait le shell. echo ne fait aucune interprétation de barre oblique inverse, donc ce qu'il affiche est ce que le Shell lui a transmis.

$ echo "\\"
\
$ echo '\\'
\\
101
John Kugelman

Vous auriez pu écrire la commande comme

grep "\\\\" ...

Cela a deux paires de barres obliques inverses que bash convertira en deux barres obliques inverses simples. Cette nouvelle paire sera ensuite passée à grep comme une barre oblique inversée vous obtenant ce que vous voulez.

4
Nikolaos Kakouros