我想将以下内容拆分jdk-1.6.0_30-fcs.x86_64
为jdk-1.6.0_30
. 我尝试了以下方法sed 's/\([a-z][^fcs]*\).*/\1/'
,但最终得到jdk-1.6.0_30-
. 我认为以错误的方式接近它,有没有办法从单词的末尾开始并向后遍历直到遇到-
?
问问题
74 次
3 回答
1
不完全是,但您可以使用 . 将模式锚定到字符串的末尾$
。然后你只需要确保你重复的字符可能不包括连字符:
echo jdk-1.6.0_30-fcs.x86_64 | sed 's/-[^-]*$//'
这将从 a 匹配-
到字符串的末尾,但其间的所有字符都必须与 from 不同-
(这样它就已经不匹配第一个连字符了)。
稍微详细一点的解释。引擎首先尝试匹配文字-
。这将首先-
在字符串中的第一个工作(显然)。然后[^-]*
匹配尽可能多的非-
字符,因此它会消耗1.6.0_30
(因为下一个字符实际上是连字符)。现在引擎将尝试匹配$
,但这不起作用,因为我们不在字符串的末尾。会发生一些回溯,但我们可以在这里忽略它。最后,引擎将放弃匹配第一个-
并继续遍历字符串。然后引擎会将文字-
与第二个匹配-
。现在[^-]*
会消耗fcs.x86_64
。现在我们实际上在字符串的末尾并且$
将匹配,因此完整匹配(将被删除的是)-fcs.x86_64
。
于 2012-11-07T21:27:06.030 回答
1
使用 cut
>>
echo 'jdk-1.6.0_30-fcs.x86_64' | cut -d- -f-2
于 2012-11-07T21:30:53.783 回答