Есть ли простой способ передать «сырую» строку в grep?

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, если нет?

50
задан Micha Wiedenmann 15 February 2019 в 00:18
поделиться