Chcę zrobić grep \resources\
. Jak mam to zrobic?
Próbowałem:
grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"
grep
regular-expression
Tom Medley
źródło
źródło
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:
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
zamiastecho
wieluecho
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ć:lub równoważnie:
(obie linie mówią powłoce, aby przekazała
foo\\bar
jako argumentgrep
).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"…"
.źródło
Możesz także użyć
fgrep
(tylkogrep
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ę.źródło
..\
i nawet'..\\'
nie uzyskałem oczekiwanych rezultatów.grep -F '..\'
dostałem to, co chciałem! Dziękigrep
wymaga czterech odwrotnych ukośników do reprezentowania odwrotnego ukośnika:źródło
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
.