[英]Unable to figure out regex bash or sed or awk
我想将以下jdk-1.6.0_30-fcs.x86_64
为jdk-1.6.0_30
。 我尝试了以下sed 's/\\([az][^fcs]*\\).*/\\1/'
但最终得到jdk-1.6.0_30-
。 我认为这是错误的方法,有没有一种方法可以从单词的末尾开始并向后移动直到遇到-
?
不完全是,但是您可以使用$
将模式锚定到字符串的末尾。 然后,您只需要确保重复的字符不包含连字符即可:
echo jdk-1.6.0_30-fcs.x86_64 | sed 's/-[^-]*$//'
这将从-
到字符串的末尾匹配,但是中间的所有字符都必须与-
不同(这样它就不会与第一个连字符匹配)。
稍微详细一点的解释。 引擎尝试匹配字面-
第一。 这将首先在工作第一-
字符串(显然)英寸 然后[^-]*
匹配尽可能多的非-
字符,因此它将消耗1.6.0_30
(因为下一个字符实际上是连字符)。 现在,引擎将尝试匹配$
,但这不起作用,因为我们不在字符串末尾。 发生了一些回溯,但是我们可以在这里忽略它。 最后,引擎将放弃匹配第一个-
并继续通过字符串。 那么发动机将匹配字面-
与第二-
现在[^-]*
将消耗fcs.x86_64
。 现在我们实际上位于字符串的末尾,并且$
将匹配,因此完全匹配(将被删除的)是-fcs.x86_64
。
使用cut
>>
echo 'jdk-1.6.0_30-fcs.x86_64' | cut -d- -f-2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.