grep从命令行使用时不能输入"原始"字符串,因为某些字符需要转义才能被视为文字.例如:
$ grep '(hello|bye)' # WON'T MATCH 'hello'
$ grep '\(hello\|bye\)' # GOOD, BUT QUICKLY BECOMES UNREADABLE
Run Code Online (Sandbox Code Playgroud)
我printf用来自动转义字符串:
$ printf '%q' '(some|group)\n'
\(some\|group\)\\n
Run Code Online (Sandbox Code Playgroud)
这会生成字符串的bash-escaped版本,并且使用反引号,可以很容易地将其传递给grep调用:
$ grep `printf '%q' '(a|b|c)'`
Run Code Online (Sandbox Code Playgroud)
但是,它显然不适用于此:输出中的某些字符不会被转义,而有些则不必要.例如:
$ printf '%q' '(^#)'
\(\^#\)
Run Code Online (Sandbox Code Playgroud)
该^传递给角色时,不应该逃脱grep.
是否有一个cli工具,它接受一个原始字符串并返回一个bash-escaped版本的字符串,可以直接用作grep的模式?如果没有,我怎么能用纯粹的bash来实现呢?