懒惰的正则表达式运算符在 bash 中不起作用


echo "$(expr "title: Purple Haze       artist: Jimi Hendrix" : 'title:s*(.*?)s*artist.*' )"

指纹

Purple Haze             

使用尾随空格,即使我使用的是?惰运算符。

我已经在 https://regex101.com/上对此进行了测试,它按预期工作,bash 有什么不同?

您没有使用 bash 的正则表达式匹配,而是使用 expr . expr没有"?惰运算符",它只实现了基本的正则表达式(在Linux版本中有一些扩展,例如s用于空格,但这不包括类似Perl的惰性运算符)。(就此而言,bash也没有。

如果不希望.*包含尾随空格,请指定它必须以非空格的字符结尾:

'title:s*(.*S)s*artist.*'

正如 Gilles 指出的那样,你没有使用 bash 正则表达式。为此,您可以使用正则表达式匹配运算符=~如下所示:

re='title:[[:space:]]*(.*[^[:space:]])[[:space:]]*artist.*'
details='title: Purple Haze       artist: Jimi Hendrix'
[[ $details =~ $re ]] && echo "${BASH_REMATCH[1]}"

这不使用延迟匹配,而是在捕获组的末尾使用非空格字符,因此删除尾随空格。第一个捕获组存储在 ${BASH_REMATCH[1]} 中。

以牺牲跨平台可移植性为代价,也可以使用速记sS而不是[[:space:]][^[:space:]]

re='title:s*(.*S)s*artist.*'

相关内容

  • 没有找到相关文章

最新更新