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

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

有很多针对单个字符的解决方案,但不适用于子字符串。我有一个接近的解决方案,但它会删除最后一次出现子字符串后的所有内容:

$ echo pkg-new-pkg-20180925-090719.x86_64 | sed -n -e "s/^.*pkg-//p"
20180925-090719.x86_64

我什么是:

$ echo pkg-new-pkg-20180925-090719.x86_64 | ???
new-pkg-20180925-090719.x86_64

我要分割的子字符串就是pkg-这种情况。有任何想法吗?

答案1

在变量中:

var=pkg-new-pkg-20180925-090719.x86_64
printf '%s\n' "${var#*pkg-}"

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

在文本输入流上:

sed 's/pkg-/\
/;s/.*\n//'

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

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

sed -E 's/.*?pkg-//'

perl

perl -pe 's/.*?pkg-//'

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

答案2

我已经通过下面提到的两种方法完成了

第一种方法

     echo "pkg-new-pkg-20180925-090719.x86_64"| sed "s/pkg-//"
new-pkg-20180925-090719.x86_64

第二种方法

echo "pkg-new-pkg-20180925-090719.x86_64"| awk -F "-" '{$1="";print $0}'| sed 's/^ //g'| sed "s/ /-/g"

new-pkg-20180925-090719.x86_64

相关内容