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 工具接受原始字符串并返回可以直接用作 grep 模式的字符串的 bash 转义版本?如果不是,我怎样才能在纯 bash 中实现这一点?