Есть ли способ избежать кавычек в 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.exe
escape-символ, гарантирует, что "
рассматривается дословно и удаляется 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