grep: конечная обратная косая черта


23

Я хочу сделать grep для \resources\. Как мне это сделать?

Я пробовал:

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

Ни одна из этих работ .


5
Используйте одинарные кавычки вместо двойных, чтобы избежать интерпретации обратной косой черты в bash. grep '\\resources\\'
Пол Томблин

Ответы:


27

Обратная косая черта является специальным символом для многих приложений:

  • включая оболочку: вам нужно избегать ее, используя другую обратную косую черту или более элегантно, используя одинарные кавычки, когда это возможно:

    $ 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).

  • Многие другие команды интерпретируют обратную косую черту в некоторых своих аргументах ... и необходимы два уровня экранирования (один для избежания интерпретации оболочки, другой для избежания интерпретации команды).


Кстати, для оболочки одинарные кавычки '…'предотвращают любой вид интерпретации символов, но двойные кавычки предотвращают только некоторые из них: в частности $, `и \остаются активными символами внутри "…".


18

Вы также можете использовать fgrep(что только grepс -Fфлагом). Это заставляет grep интерпретировать шаблон как фиксированную строку (т. Е. Он будет обрабатывать a \как литерал \). Вам все еще нужно будет защищать обратную косую черту от расширения оболочкой.

grep -F '\resources\'

Флаг там по причине! Я пытался найти ..\и даже '..\\'не получил желаемых результатов. grep -F '..\'получил то, что хотел! Спасибо
FreeSoftwareServers

.. Попробуйте отформатировать этот комментарий правильно! -> meta.stackexchange.com/questions/201663/…
FreeSoftwareServers

3

grepдля представления обратной косой черты требуется четыре обратных слеша:

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

12
Это довольно обманчивое упрощение. grepтребуется только 1 обратный слеш, чтобы избежать другого обратного слеша, но оболочка также требует, чтобы обратный слеш заключался в кавычки. Двойные кавычки ( ") НЕ заключают в кавычки обратную косую черту, но обратная косая черта делает, поэтому двойные кавычки в вашем примере ничего не делают, и вместо них нужны 4 обратные косые черты.
jw013

Мне пришлось использовать четыре обратные косые черты в Windows, хотя командная строка Windows не обрабатывает обратную косую черту, как * nix. Интересно, порты GnuWin неправильно поняли эффект оболочки и жестко закодировали требование 4 слешей, думая, что это было то, что требовалось grep.
Synetech
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.