grep: barra rovesciata finale


23

Voglio fare un grep per \resources\. Come faccio a fare questo?

Ho provato:

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

Nessuno di questi lavori .


5
Usa virgolette singole anziché doppie per evitare l'interpretazione di bash delle barre rovesciate. grep '\\resources\\'
Paul Tomblin,

Risposte:


27

La barra rovesciata è un carattere speciale per molte applicazioni:

  • compresa la shell: è necessario evitarlo usando un'altra barra rovesciata o più elegantemente, usando virgolette singole quando possibile:

    $ printf '%s\n' foo\\bar 'foo\bar'
    foo\bar
    foo\bar
    

    Qui il comando ha ricevuto due argomenti con valore foo\bar, che sono stati ripetuti così com'è sul terminale.

    (Sopra, ho usato al printfposto di echotante echoimplementazioni anche la loro interpretazione della barra rovesciata (qui si espanderebbe \bin un carattere backspace)).

  • Ma la barra rovesciata è anche un personaggio speciale per grep. Questo comando riconosce molte sequenze speciali come \(, \|, \.e così via. Allo stesso modo è necessario alimentare grep con un doppio \\per un vero carattere barra rovesciata. Ciò significa che usando la shell è necessario digitare:

    grep 'foo\\bar'
    

    o equivalentemente:

    grep foo\\\\bar
    

    (entrambe le righe indicano alla shell di trasmettere foo\\barcome argomento a grep).

  • Molti altri comandi interpretano barre rovesciate in alcuni dei loro argomenti ... e sono necessari due livelli di escape (uno per sfuggire all'interpretazione della shell, uno per sfuggire all'interpretazione del comando).


A proposito, per la shell, le virgolette singole '…'impediscono qualsiasi tipo di interpretazione dei caratteri, ma le virgolette doppie ne impediscono solo alcune: in particolare $, `e \rimangono caratteri attivi all'interno "…".


18

Puoi anche usare fgrep(che è solo grepcon la -Fbandiera). Questo costringe grep a interpretare il modello come una stringa fissa (cioè tratterà a \come un valore letterale \). Dovrai comunque proteggere le barre rovesciate dall'espansione della shell.

grep -F '\resources\'

La bandiera è lì per un motivo! Stavo cercando di fare il grep ..\e anche con '..\\'non ho ottenuto i risultati desiderati. grep -F '..\'mi ha fatto quello che volevo! Grazie
FreeSoftwareServers il

.. Prova a formattare correttamente quel commento! -> meta.stackexchange.com/questions/201663/…
FreeSoftwareServers

3

greprichiede quattro barre rovesciate per rappresentare una barra rovesciata:

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

12
Questa è una semplificazione piuttosto fuorviante. greprichiede solo 1 barra rovesciata per sfuggire a un'altra barra rovesciata, ma la shell richiede anche virgolette da quotare. Le virgolette doppie ( ") NON citano le barre rovesciate, ma la barra rovesciata lo fa, motivo per cui le virgolette doppie nell'esempio non fanno nulla e sono invece necessarie le 4 barre rovesciate.
jw013,

Ho dovuto usare quattro barre rovesciate in Windows anche se il prompt dei comandi di Windows non tratta le barre rovesciate come * nix. Mi chiedo se i porti di GnuWin abbiano frainteso l'effetto della shell e abbiano codificato a fondo un requisito di 4 barre, pensando che fosse quello che era richiesto grep.
Synetech,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.