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