grep
нельзя использовать "сырые" строки при использовании из командной строки, так как некоторые символы должны быть экранированы, чтобы не обрабатываться как литералы. Например:
$ grep '(hello|bye)' # WON'T MATCH 'hello'
$ grep '\(hello\|bye\)' # GOOD, BUT QUICKLY BECOMES UNREADABLE
Я использовал printf
для строк с автоматическим удалением:
$ printf '%q' '(some|group)\n'
\(some\|group\)\\n
Это создает bash -сказанную версию строки и используя обратные ссылки, это может быть легко передано на вызов grep:
$ grep `printf '%q' '(a|b|c)'`
Однако это явно не предназначено для этого: некоторые символы на выходе не экранированы, а некоторые - излишне. Например:
$ printf '%q' '(^#)'
\(\^#\)
Символ ^
не должен быть экранирован при передаче в grep
.
Есть ли инструмент cli, который берет необработанную строку и возвращает a bash -безовую версию строки, которая может быть непосредственно использована как шаблон с grep? Как я могу достичь этого в чистом bash, если не?