Voglio fare un grep per \resources\
. Come faccio a fare questo?
Ho provato:
grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"
Voglio fare un grep per \resources\
. Come faccio a fare questo?
Ho provato:
grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"
Risposte:
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 printf
posto di echo
tante echo
implementazioni anche la loro interpretazione della barra rovesciata (qui si espanderebbe \b
in 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\\bar
come 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 "…"
.
Puoi anche usare fgrep
(che è solo grep
con la -F
bandiera). 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\'
..\
e anche con '..\\'
non ho ottenuto i risultati desiderati. grep -F '..\'
mi ha fatto quello che volevo! Grazie
grep
richiede quattro barre rovesciate per rappresentare una barra rovesciata:
grep "\\\\resources\\\\"
grep
richiede 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.
grep
.
grep '\\resources\\'