将正则表达式转换为bash中grep/sed可以接受的字符串的最佳方法是什么?
例如,given the following regular expression
(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
bash不喜欢它(因此这个正则表达式不能在grep中使用)
$ echo "(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])"
-bash: syntax error near unexpected token `('
$ echo '(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])'
>
> ^C
我假设正则表达式需要转义,但我没有找到任何好的工具可以为我做这件事。
如何让grep在bash中使用这个正则表达式?
2条答案
按热度按时间5sxhfpxr1#
让我们合并两个有用的Bash特性来实现这一点。
首先,您可以完全避免使用带引号分隔符的Here Doc来转义字符串(即Here Doc)。
<<"separator"
)。例如,你可以这样写:其次,通过将Here Doc Package 到函数中,您可以轻松地将其抓取到变量中。从那时起,您可以直接将该变量提供给grep或sed。
例如:
请注意,您的正则表达式需要一个符合Perl的正则表达式引擎(也称为。字符类表达式中转义的十六进制序列(即
[\x70-\x7f]
)不受大多数其他引擎支持,这意味着前面的序列将匹配这些字符:\
、x
、7
、0-\
、x
、7
、f
)。4dbbbstv2#
您唯一需要知道的是,如果字符串内部包含单引号,则如何用单引号括起字符串。让我简化字符串作为一个例子:
如你所知,反斜杠不能转义单引号中的单引号:
相反,你可以说:
它可能看起来很奇怪,但它只是
'O'
,\'
和'Reilly'
的串联。然后你可以用以下命令将一个变量赋值给正则表达式:
请注意,这两个单引号按照上面的示例处理。