Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Lazy正则表达式运算符不';我不能在bash中工作_Regex_Bash_Expr - Fatal编程技术网

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.*'