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