在第一次出现子字符串后获取所有内容

Dan*_*ous 0 bash sed

有很多解决方案可以处理单个字符,但不适用于子字符串。我有一个关闭的解决方案,但它会在最后一次出现子字符串后删除所有内容:

$ echo pkg-new-pkg-20180925-090719.x86_64 | sed -n -e "s/^.*pkg-//p"
20180925-090719.x86_64
Run Code Online (Sandbox Code Playgroud)

想要的是:

$ echo pkg-new-pkg-20180925-090719.x86_64 | ???
new-pkg-20180925-090719.x86_64
Run Code Online (Sandbox Code Playgroud)

pkg-在这种情况下,我要拆分的子字符串。有任何想法吗?

Sté*_*las 6

在一个变量中:

var=pkg-new-pkg-20180925-090719.x86_64
printf '%s\n' "${var#*pkg-}"
Run Code Online (Sandbox Code Playgroud)

${var#pattern}删除与模式匹配的最短前导部分(${var##pattern}最长部分)。

在文本输入流上:

sed 's/pkg-/\
/;s/.*\n//'
Run Code Online (Sandbox Code Playgroud)

这将用换行符(否则不会出现在模式空间中的字符)替换第一次出现的pkg-,然后删除该换行符之前的所有内容。一些sed实现还允许您编写它,sed 's/pkg-/\n/;s/.*\n//'尽管这既不是可移植的也不是标准的。

使用 ast-open sed(也适用于ssed -R):

sed -E 's/.*?pkg-//'
Run Code Online (Sandbox Code Playgroud)

perl

perl -pe 's/.*?pkg-//'
Run Code Online (Sandbox Code Playgroud)

.*?的非贪婪版本在哪里.*