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工具,可以将原始字符串转换为bash转义版本的字符串,并可直接用作grep模式?如果没有,我该如何在纯bash中实现?
printf
打印它们?在那个时候,它们已经准备好被传递给printf
或grep
了。 - ephemientgrep -F \(some\|group\)\\n
显然有效(这就是%q
整个的意义所在...) - ephemient