0

我想将以下内容拆分jdk-1.6.0_30-fcs.x86_64jdk-1.6.0_30. 我尝试了以下方法sed 's/\([a-z][^fcs]*\).*/\1/',但最终得到jdk-1.6.0_30-. 我认为以错误的方式接近它,有没有办法从单词的末尾开始并向后遍历直到遇到-

4

3 回答 3

1

尝试这样做:

echo 'jdk-1.6.0_30-fcs.x86_64' | sed 's/-fcs.*//'

如果使用,你可以这样做:

var=jdk-1.6.0_30-fcs.x86_64
echo ${var%%-fcs*}
jdk-1.6.0_30

后来的解决方案使用参数扩展,在Linux和Minix3上测试

于 2012-11-07T21:26:46.990 回答
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 回答