3 回答
TA贡献1735条经验 获得超5个赞
因为这是一个常见的常见问题解答,所以让我列出一些Bash不支持的结构,以及如何解决它们,这里有一个简单的解决方法。
正则表达式有多种常用方言。Bash支持的是扩展正则表达式的变体。例如,这不同于许多在线正则表达式测试器支持的功能,后者通常是更现代的Perl 5 / PCRE变体。
击不支持\d \D \s \S \w \W-这些可以与POSIX字符类等同替换[[:digit:]],[^[:digit:]],[[:space:]],[^[:space:]],[_[:alnum:]],和[^_[:alnum:]],分别。(请注意最后一种情况,其中[:alnum:]POSIX字符类使用下划线增强,以完全等同于Perl的\w速记形式。)
Bash不支持非贪婪匹配。有时您可以a.*?b用类似的东西代替,a[^ab]*b以在实践中获得类似的效果,尽管两者并不完全相同。
Bash不支持非括号(?:...)。在平凡的情况下,只需使用捕获括号即可(...);当然,如果您使用捕获组和/或反向引用,则会重新编号捕获组。
击不支持lookarounds像(?<=before)或者(?!after),事实上任何与(?是一个Perl扩展。尽管您经常可以将问题改写为可以避免环顾的问题,但没有简单的常规解决方法。
TA贡献1842条经验 获得超21个赞
我知道您已经“解决”了这个问题,但是您最初的问题很可能就像$regex在测试中不引用一样简单。即:
if [[ $data =~ "$regex" ]]; then
Bash变量扩展将简单地放入字符串中,并且原始正则表达式中的空格将破坏测试,因为:
regex="^Disk (/dev[\S]+):((?!Disk)[\s\S])*"
if [[ $data =~ $regex ]]; then
等价于:
if [[ $data =~ ^Disk (/dev[\S]+):((?!Disk)[\s\S])* ]]; then
bash / test会很有趣地解释奖金参数和所有未引用的元字符。
请记住,bash不会传递变量,而是会扩展变量。
- 3 回答
- 0 关注
- 1015 浏览
添加回答
举报