Я хочу сделать grep для \resources\
. Как мне это сделать?
Я пробовал:
grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"
Я хочу сделать grep для \resources\
. Как мне это сделать?
Я пробовал:
grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"
Ответы:
Обратная косая черта является специальным символом для многих приложений:
включая оболочку: вам нужно избегать ее, используя другую обратную косую черту или более элегантно, используя одинарные кавычки, когда это возможно:
$ printf '%s\n' foo\\bar 'foo\bar'
foo\bar
foo\bar
Здесь команда получила два аргумента со значением foo\bar
, которые были отображены как есть на терминале.
(Выше я использовал printf
вместо того, чтобы echo
многие echo
реализации также делали свою собственную интерпретацию обратной косой черты (здесь это расширилось бы \b
до символа возврата).
Но обратный слеш также является специальным символом для grep
. Эта команда распознает много специальных последовательностей , таких как \(
, \|
, \.
, и так далее. Точно так же вам нужно ввести grep с двойным \\
символом для реального символа обратной косой черты. Это означает, что при использовании оболочки вам нужно набрать:
grep 'foo\\bar'
или эквивалентно:
grep foo\\\\bar
(обе строки указывают оболочке на передачу в foo\\bar
качестве аргумента grep
).
Многие другие команды интерпретируют обратную косую черту в некоторых своих аргументах ... и необходимы два уровня экранирования (один для избежания интерпретации оболочки, другой для избежания интерпретации команды).
Кстати, для оболочки одинарные кавычки '…'
предотвращают любой вид интерпретации символов, но двойные кавычки предотвращают только некоторые из них: в частности $
, `
и \
остаются активными символами внутри "…"
.
Вы также можете использовать fgrep
(что только grep
с -F
флагом). Это заставляет grep интерпретировать шаблон как фиксированную строку (т. Е. Он будет обрабатывать a \
как литерал \
). Вам все еще нужно будет защищать обратную косую черту от расширения оболочкой.
grep -F '\resources\'
..\
и даже '..\\'
не получил желаемых результатов. grep -F '..\'
получил то, что хотел! Спасибо
grep
для представления обратной косой черты требуется четыре обратных слеша:
grep "\\\\resources\\\\"
grep
требуется только 1 обратный слеш, чтобы избежать другого обратного слеша, но оболочка также требует, чтобы обратный слеш заключался в кавычки. Двойные кавычки ( "
) НЕ заключают в кавычки обратную косую черту, но обратная косая черта делает, поэтому двойные кавычки в вашем примере ничего не делают, и вместо них нужны 4 обратные косые черты.
grep
.
grep '\\resources\\'