【问题标题】:Bash regex matching not working [duplicate]Bash正则表达式匹配不起作用[重复]
【发布时间】:2013-10-11 21:03:56
【问题描述】:

所以我有这个功能

function test(){
 local output="CMD[hahahhaa]"
 if [[ "$output" =~ "/CMD\[.*?\]/" ]]; then
  echo "LOOL"
 else
  echo "$output"
 fi;

}

然而,在命令行中执行测试会输出 $output 而不是“LOOL”,尽管模式应该匹配 $output...

我做错了什么?

【问题讨论】:

  • 您是否尝试使用.*? 作为非贪婪匹配? bash 不支持 Perl 风格的运算符。正斜杠也是 Perl 匹配语法的一部分,而不是正则表达式本身的一部分。

标签: regex linux bash shell terminal


【解决方案1】:

不要使用引号""

if [[ "$output" =~ ^CMD\[.*?\]$ ]]; then

正则表达式运算符=~ 期望在其 RHS 上使用 未引用 正则表达式,并且只匹配子字符串,除非锚点 ^(输入开始)和 $(结束input) 也用于使其与整个 LHS 匹配。

引号 "" 覆盖此行为并强制进行简单的字符串匹配,即匹配器开始逐字查找所有这些字符 \[.*?\]

【讨论】:

  • 这实际上不起作用,对吧? Bash 不支持惰性修饰符。
  • 由于 [[ 的正则表达式的这种行为,我在调试脚本中的一行代码时浪费了几个小时。乍一看,使用 '...' 会得到相同的结果。这样做的动机是什么,即赋予双引号字符串单引号的权力?我无法理解背后的这种逻辑。我在 bash 手册中找到了这个“铭文”:“对 [[ 和 ]] 之间的单词不执行分词和路径名扩展;...”这会是一个线索吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 2012-10-31
  • 2014-04-22
相关资源
最近更新 更多