grep: barre oblique inverse arrière

23

Je veux faire un grep pour \resources\. Comment puis-je faire cela?

J'ai essayé:

grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"

Aucun de ces travaux .

Tom Medley
la source
5
Utilisez des guillemets simples au lieu de guillemets doubles pour éviter l'interprétation par bash des barres obliques inverses. grep '\\resources\\'
Paul Tomblin

Réponses:

27

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é printfau lieu de echonombreuses echoimplémentations qui font également leur propre interprétation de la barre oblique inverse (ici se développerait \ben 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\\barcomme 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 "…".

Stéphane Gimenez
la source
18

Vous pouvez également utiliser fgrep(qui est juste grepavec le -Fdrapeau). 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\'
mills013
la source
Le drapeau est là pour une raison! J'essayais de chercher ..\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
FreeSoftwareServers
.. Essayez de formater ce commentaire correctement! -> meta.stackexchange.com/questions/201663/…
FreeSoftwareServers
3

grepnécessite quatre barres obliques inverses pour représenter une barre oblique inverse:

grep "\\\\resources\\\\"
Tom Medley
la source
12
Il s'agit d'une simplification excessive trompeuse. grepné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.
jw013
J'ai dû utiliser quatre barres obliques inverses dans Windows même si l'invite de commande Windows ne traite pas les barres obliques inverses comme le fait * nix. Je me demande si les ports GnuWin ont mal compris l'effet du shell et codé en dur une exigence de 4 barres obliques , pensant que c'était ce qui était requis par grep.
Synetech