Je veux faire un grep pour \resources\
. Comment puis-je faire cela?
J'ai essayé:
grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"
Je veux faire un grep pour \resources\
. Comment puis-je faire cela?
J'ai essayé:
grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"
Réponses:
La barre oblique inverse est un caractère spécial pour de nombreuses applications:
y compris le shell: vous devez l'échapper en utilisant une autre barre oblique inverse ou plus élégamment, en utilisant des guillemets simples lorsque cela est possible:
$ printf '%s\n' foo\\bar 'foo\bar'
foo\bar
foo\bar
Ici, la commande a reçu deux arguments avec valeur foo\bar
, qui ont été répercutés tels quels sur le terminal.
(Ci-dessus, j'ai utilisé printf
au lieu de echo
nombreuses echo
implémentations qui font également leur propre interprétation de la barre oblique inverse (ici se développerait \b
en caractère de retour arrière)).
Mais la barre oblique inverse est aussi un caractère spécial pour grep
. Cette commande reconnaît de nombreuses séquences spéciales comme \(
, \|
, \.
et ainsi de suite. De même, vous devez alimenter grep avec un double \\
pour un caractère de barre oblique inverse réelle. Cela signifie qu'en utilisant le shell, vous devez taper:
grep 'foo\\bar'
ou équivalent:
grep foo\\\\bar
(les deux lignes indiquent au shell de transmettre foo\\bar
comme argument grep
).
De nombreuses autres commandes interprètent les barres obliques inverses dans certains de leurs arguments… et deux niveaux d'échappement sont nécessaires (un pour échapper à l'interprétation du shell, un pour échapper à l'interprétation des commandes).
Soit dit en passant, pour le shell, les guillemets simples '…'
empêchent tout type d'interprétation des caractères, mais les guillemets doubles n'en empêchent que certains: en particulier $
, `
et \
restent des caractères actifs à l'intérieur "…"
.
Vous pouvez également utiliser fgrep
(qui est juste grep
avec le -F
drapeau). Cela force grep à interpréter le modèle comme une chaîne fixe (c'est-à-dire qu'il traitera a \
comme un littéral \
). Vous devrez toujours protéger les barres obliques inverses de l'expansion par le shell.
grep -F '\resources\'
..\
et même avec '..\\'
je n'ai pas obtenu les résultats que je voulais. grep -F '..\'
m'a donné ce que je voulais! Merci
grep
nécessite quatre barres obliques inverses pour représenter une barre oblique inverse:
grep "\\\\resources\\\\"
grep
nécessite seulement 1 barre oblique inverse pour échapper à une autre barre oblique inverse, mais le shell nécessite également que les barres obliques inversées soient citées. Les guillemets doubles ( "
) NE citent PAS les barres obliques inverses, mais les barres obliques inverses le font, c'est pourquoi les guillemets doubles dans votre exemple ne font rien et les 4 barres obliques inverses sont nécessaires à la place.
grep
.
grep '\\resources\\'