Chcę zrobić grep \resources\
. Jak mam to zrobic?
Próbowałem:
grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"
Chcę zrobić grep \resources\
. Jak mam to zrobic?
Próbowałem:
grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"
Odpowiedzi:
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 printf
zamiast echo
wielu echo
implementacji, które również dokonują własnej interpretacji odwrotnego ukośnika (tutaj rozwinąłby się \b
do 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\\bar
jako 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 "…"
.
Możesz także użyć fgrep
(tylko grep
z -F
flagą). 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\'
..\
i nawet '..\\'
nie uzyskałem oczekiwanych rezultatów. grep -F '..\'
dostałem to, co chciałem! Dzięki
grep
wymaga czterech odwrotnych ukośników do reprezentowania odwrotnego ukośnika:
grep "\\\\resources\\\\"
grep
wymaga 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.
grep
.
grep '\\resources\\'