Regex Lazy正则表达式运算符不';我不能在bash中工作
印刷品Regex Lazy正则表达式运算符不';我不能在bash中工作,regex,bash,expr,Regex,Bash,Expr,印刷品 echo "$(expr "title: Purple Haze artist: Jimi Hendrix" : 'title:\s*\(.*\?\)\s*artist.*' )" 使用尾随空格,即使我使用的是?惰性运算符 我已经在上进行了测试,它可以正常工作,bash有什么不同吗?您没有使用bash的regexp匹配,而是使用了exprexpr没有“?惰性运算符”,它只实现(在Linux版本中有一些扩展,例如用于空格的\s,但不包括类似Perl的惰性运算符)。(就此而言,
echo "$(expr "title: Purple Haze artist: Jimi Hendrix" : 'title:\s*\(.*\?\)\s*artist.*' )"
使用尾随空格,即使我使用的是?
惰性运算符
我已经在上进行了测试,它可以正常工作,bash有什么不同吗?您没有使用bash的regexp匹配,而是使用了
expr
expr
没有“?
惰性运算符”,它只实现(在Linux版本中有一些扩展,例如用于空格的\s
,但不包括类似Perl的惰性运算符)。(就此而言,巴什也不例外。)
如果不希望*
包含尾随空格,请指定尾随空格必须以非空格字符结尾:
Purple Haze
,您没有使用bash正则表达式。为此,您可以使用正则表达式匹配运算符=~
,如下所示:
'title:\s*\(.*\S\)\s*artist.*'
这不是使用惰性匹配,而是在捕获组的末尾使用非空格字符,因此尾部的空格将被删除。第一个捕获组存储在${BASH_REMATCH[1]}
中
以跨平台可移植性为代价,也可以使用速记\s
和\s
而不是[:space:]
和[^[:space:]
:
re='title:[[:space:]]*(.*[^[:space:]])[[:space:]]*artist.*'
details='title: Purple Haze artist: Jimi Hendrix'
[[ $details =~ $re ]] && echo "${BASH_REMATCH[1]}"
不为我打印任何内容(使用MacOS 10.6试用)不要逃避
?
@Enessay不,这些是BRE,不是ERE:?
匹配一个问号,?
是零或一运算符。@Gilles哦,我的坏。。。很高兴认识@JakubM。很抱歉,我应该添加,我在Debian上,linux上的expr
功能更强大一些
re='title:\s*(.*\S)\s*artist.*'