bash中正则表达式中的意外行为

时间:2017-06-29 16:51:26

标签: regex bash

我创建了这个正则表达式并成功测试了它

https://regex101.com/r/a7qvuw/1

然而,正则表达式在我写的这个bash代码中表现不同

# Splitting by colon
IFS=';' read -ra statements <<< $contents

# Splitting by the = sign.
regex="\s*(.*?)\s*=\s*(.*)\b"
for i in "${statements[@]}"; do
   if [[ $i =~ $regex ]]; then
      key=${BASH_REMATCH[1]} 
      params=${BASH_REMATCH[2]}
      echo "KEY: $key| PARAMS: $params"          
   fi
done  

变量$ contents具有链接中使用的文本。问题是$ key的末尾有空格,而我尝试的正则表达式匹配没有空格的单词。

我得到这样的输出:

KEY: vclock_spec | PARAMS: clk_i 1 1

正如您所看到的,vclock_spec与|之间存在空格哪个不应该在那里。我做错了什么?

1 个答案:

答案 0 :(得分:1)

作为@Cyrus mentioned,Bash正则表达式不支持延迟量词。他们充当贪婪的人。

您可以使用

修复您的模式以使用Bash
regex="\s*([^=]*\S)\s*=\s*(.*)\b"
           ^^^^^^^

[^=]*匹配零个或多个符号,然后=\S匹配任何非空格(可能[^\s=]在这里会更精确,因为它匹配任何字符但一个空格(\s)和=,但看起来regex="\s*([^=]*[^\s=])\s*=\s*(.*)\b"会产生相同的结果。)