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