Есть ли способ избежать кавычек в ripgrep для MS Windows (Powershell или CMD)?

Я хочу найти строку "Hello (Привет начинается с двойной кавычки) в текстовых файлах с использованием ripgrep.

Обычно в Bash или ZSH это срабатывает, экранируя обратную косую черту или заключая в одинарные кавычки:

rg \"Hello
rg '"Hello'

Однако в MS Windows (Powershell и CMD) я пробовал их, но ни один из них не работал:

rg \"Hello
rg '"Hello'
rg `"Hello
rg '`"Hello'

Есть ли способ избежать одинарных или двойных кавычек с помощью ripgrep в MS Windows?

3 ответа

Решение

Дословная строка "Hello в конечном итоге должно быть передано как \"Hello к rg ("\"Hello"тоже будет работать). То есть дословно"char. должно быть\-экранировано:

От cmd.exe:

rg \^"Hello

^, cmd.exeescape-символ, гарантирует, что " рассматривается дословно и удаляется cmd.exe перед звонком rg.
Обратите внимание, что^ здесь не обязательно, но это предотвращает " считаться началом аргумента в двойных кавычках, что могло бы иметь значение, если бы были дополнительные аргументы.

Из PowerShell:

rg \`"Hello

`, Escape-символ PowerShell, гарантирует, что " обрабатывается дословно и удаляется PowerShell перед вызовом rg.


Возможно, явное \-экранирование не должно быть необходимым, потому что это обязанность оболочки правильно передавать аргументы целевым исполняемым файлам после того, как пользователь удовлетворил собственные требования оболочки (экранирование дословно" с ^ в cmd.exe, и с ` в PowerShell).

В контексте PowerShell это проблемное поведение резюмируется в этом ответе.

Обратите внимание, что в PowerShell это дополнительное экранирование требуется только при вызове внешних программ;внутри PowerShell не требуется - например, когда вы звонитеSelect-String, как показано в ответе js2010.

Вы можете использовать rg -F \"Hello

         -F, --fixed-strings 
   Treat the pattern as a literal string instead of a regular expression. When this flag is used, special regular expression meta characters such as .(){}*+ do not
   need to be escaped.

   This flag can be disabled with --no-fixed-strings.

Если вы используете PowerShell, вы также можете сделать:

get-childitem file | select-string '"hello'

file:1:"hello

Другие вопросы по тегам