如何在bash脚本中使用regexp

时间:2017-07-23 18:53:51

标签: regex bash

# Checking if we dealing with 1050 or 1050 Ti
function gpu_check() {
  test="GPU 0: GeForce GTX 1050 (UUID: GPU-97acce0b-4304-01e9-ef9d-bc3230cae912)"
  echo "testing $test"
  if [[ $test =~ "\sGTX\s1050\s" ]]; then
    echo "foud 1050"
  else
    echo "no 1050's here"
  fi
}

我正在尝试使用正则表达式,但我可以想象所有可能的变体,例如double \,添加*和。*,使用“$ test”等等,给我的不是我所期待的。

  

测试GPU 0:GeForce GTX 1050(UUID:GPU-97acce0b-4304-01e9-ef9d-bc3230cae912)

     

没有1050在这里

我如何让它发挥作用?

1 个答案:

答案 0 :(得分:3)

re='[[:space:]]GTX[[:space:]]1050[[:space:]]'
[[ $test =~ $re ]]

......会做的。

  • \s是PCRE语法。 =~仅保证POSIX ERE语法,因此PCRE扩展不可用。 [[:space:]]是符合POSIX标准的等效文件。
  • 你不能引用正则表达式而不是字面意思。也就是说 - 如果您希望=~ $re中的值被视为正则表达式而非精确值,则必须=~ "$re"而不是re要搜索的字符串。

引用the bash-hackers wiki上的文档:

  

使用operator =〜,左侧操作数与右侧的扩展正则表达式(ERE)匹配。

     

这与模式匹配是一致的:正则表达式的每个引用部分都是字面意思,即使它包含正则表达式特殊字符。

     

最佳做法是将正则表达式与变量匹配。这是为了避免在其他有效的正则表达式上解析shell错误。