grep: Końcowy ukośnik odwrotny

23

Chcę zrobić grep \resources\. Jak mam to zrobic?

Próbowałem:

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

Żadna z tych czynności nie działa .

Tom Medley
źródło
5
Używaj pojedynczych cudzysłowów zamiast podwójnych, aby uniknąć interpretacji odwrotnych ukośników przez bash. grep '\\resources\\'
Paul Tomblin,

Odpowiedzi:

27

Odwrotny ukośnik jest znakiem specjalnym dla wielu aplikacji:

  • w tym powłoki: musisz uciec przed nią, używając innego ukośnika odwrotnego lub bardziej elegancko, używając pojedynczych cudzysłowów, jeśli to możliwe:

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

    Tutaj polecenie otrzymało dwa argumenty o wartości foo\bar, które zostały powtórzone w stanie „jak jest” na terminalu.

    (Powyżej użyłem printfzamiast echowielu echoimplementacji, które również dokonują własnej interpretacji odwrotnego ukośnika (tutaj rozwinąłby się \bdo znaku backspace)).

  • Ale odwrotny ukośnik jest także znakiem specjalnym grep. Komenda ta rozpoznaje wiele specjalne sekwencje jak \(, \|, \.i tak dalej. Więc podobnie musisz \\podać grepowi podwójny dla rzeczywistego znaku odwrotnego ukośnika. Oznacza to, że używając powłoki musisz wpisać:

    grep 'foo\\bar'
    

    lub równoważnie:

    grep foo\\\\bar
    

    (obie linie mówią powłoce, aby przekazała foo\\barjako argument grep).

  • Wiele innych poleceń interpretuje ukośniki odwrotne w niektórych swoich argumentach… i potrzebne są dwa poziomy zmiany znaczenia (jeden do unikania interpretacji powłoki, drugi do interpretacji interpretacji poleceń).


Nawiasem mówiąc, w skorupkach, pojedyncze cudzysłowy '…'zapobiec jakiejkolwiek interpretacji znaków, ale cudzysłowy zapobiega tylko niektóre z nich: w szczególności $, `i \pozostają aktywne znaki wewnątrz "…".

Stéphane Gimenez
źródło
18

Możesz także użyć fgrep(tylko grepz -Fflagą). Zmusza to grep do interpretacji wzorca jako stałego ciągu (tzn. Będzie traktował \literał \). Nadal będziesz musiał chronić odwrotne ukośniki przed rozszerzaniem przez powłokę.

grep -F '\resources\'
młyny013
źródło
Flaga jest tam z jakiegoś powodu! Starałem się żałować ..\i nawet '..\\'nie uzyskałem oczekiwanych rezultatów. grep -F '..\'dostałem to, co chciałem! Dzięki
FreeSoftwareServers
.. Spróbuj poprawnie sformatować ten komentarz! -> meta.stackexchange.com/questions/201663/...
FreeSoftwareServers
3

grepwymaga czterech odwrotnych ukośników do reprezentowania odwrotnego ukośnika:

grep "\\\\resources\\\\"
Tom Medley
źródło
12
Jest to dość mylące uproszczenie. grepwymaga tylko 1 odwrotnego ukośnika, aby uciec przed innym odwrotnym ukośnikiem, ale powłoka wymaga również zacytowania odwrotnego ukośnika. Podwójne cudzysłowy ( ") NIE cytują odwrotnych ukośników, ale odwrotny ukośnik, dlatego podwójne cudzysłowy w twoim przykładzie nic nie robią i zamiast tego potrzebne są 4 odwrotne ukośniki.
jw013,
Musiałem użyć czterech ukośników odwrotnych w systemie Windows, nawet jeśli wiersz polecenia systemu Windows nie traktuje ukośników odwrotnych jak * nix. Zastanawiam się, czy porty GnuWin źle zrozumiały efekt powłoki i zakodowały na sztywno wymagania 4-ukośnikowe, myśląc, że było to wymagane grep.
Synetech,