相关疑难解决方法(0)

有一种简单的方法可以将"原始"字符串传递给grep吗?

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来实现呢?

bash grep escaping command-line-interface

50
推荐指数
4
解决办法
4万
查看次数

标签 统计

bash ×1

command-line-interface ×1

escaping ×1

grep ×1