Je veux faire un grep pour \resources\
. Comment puis-je faire cela?
J'ai essayé:
grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"
grep
regular-expression
Tom Medley
la source
la source
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:
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 deecho
nombreusesecho
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:ou équivalent:
(les deux lignes indiquent au shell de transmettre
foo\\bar
comme argumentgrep
).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"…"
.la source
Vous pouvez également utiliser
fgrep
(qui est justegrep
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.la source
..\
et même avec'..\\'
je n'ai pas obtenu les résultats que je voulais.grep -F '..\'
m'a donné ce que je voulais! Mercigrep
nécessite quatre barres obliques inverses pour représenter une barre oblique inverse:la source
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
.