使用expr string:regex剪切字符串

使用expr string:regex剪切字符串,regex,sh,Regex,Sh,有一个长字符串,包含空格分隔的单词,其中一个以$somevar结尾。 简单版本为(x为$somevar): 问题是,它只返回“cx”。它应该返回“bbcx”。这里出了什么问题?您可以尝试以下正则表达式:[^\s]+x\b*是贪婪的-它匹配尽可能多的字符。把它改成*?要使其尽可能少地匹配: .*?([^ ]+x).*? 如果你也需要“x”:你提到 其中一个以$somevar结尾 我没有跟踪我的朋友*([^]\+x)。*似乎与您的输入字符串不匹配。@某些系统上的FailedDev也使用“过时的RE

有一个长字符串,包含空格分隔的单词,其中一个以$somevar结尾。 简单版本为(x为$somevar):


问题是,它只返回“cx”。它应该返回“bbcx”。这里出了什么问题?

您可以尝试以下正则表达式:
[^\s]+x\b
*是贪婪的-它匹配尽可能多的字符。把它改成*?要使其尽可能少地匹配:

.*?([^ ]+x).*?
如果你也需要“x”:你提到

其中一个以$somevar结尾


我没有跟踪我的朋友*([^]\+x)。*似乎与您的输入字符串不匹配。@某些系统上的FailedDev也使用“过时的REs”或基本REs(我知道BSDs和Darwin/MacOS是两个),据我所知,
+
元字符不可用。请尝试类似于
{1,}
{1,\}
,并确保检查
re\u格式(7)
手册页。@ukasz,发生这种情况是因为遇到的第一个原子(
*
)与所有内容匹配。然后,由于不可能继续使用正则表达式,它会回溯到匹配的
[^]
以满足表达式,并从那里继续匹配。这是正确的,但你真正想要的是一个不贪婪的原子在开始时匹配尽可能少的原子,然后再继续。不过,我不知道怎么做。这通常在很大程度上取决于操作系统和工具集。您正在使用GNU/Linux吗?(只是阿凡达猜测:-)谢谢西迪尔,我现在知道它不起作用的原因了:)
.*?([^ ]+x).*?
kent$  echo "abc aac bbcx"|grep -Po "[^\s]+(?=x)"                                                                                        
bbc
kent$  echo "abc aac bbcx"|grep -Po "[^\s]+x(?=\s|$)"
bbcx

kent$  echo "abc aacx bbc"|grep -Po "[^\s]+x(?=\s|$)"
aacx