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 .


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 "…".


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\'

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\\\\"

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.