如何在单引号之间使用sed?

时间:2018-02-26 08:29:46

标签: jenkins groovy

我有一些简短的脚本,如下所示: 这是一种在groovy命令中执行bash的方法。

sh (script: 'printf "${INFO} | sed 's/^[^\/]*://g'"',returnStdout: true).trim()

INFO的值为test/word/fine

使用上面的脚本,我想“删除”所有内容,直到(并包括)第一个/。我无法使用单引号之间的单引号。如果可行,我可以检查我的\/是否有效。

2 个答案:

答案 0 :(得分:1)

解决方案第一: 以下简单sed可能对您有帮助。

echo "test/word/fine" | sed 's/\([^/]*\)\/\(.*\)/\2/'

解决方案第二: 无需使用sed使用bash参数扩展:

var="test/word/fine"
echo "${var#*/}"
word/fine

答案 1 :(得分:1)

显然,Groovy允许您使用三引号,因此必须强制命令使用单引号(原文如此)。

sh """printf "${INFO}" | sed 's/^[^\/]*//'"""

还要注意在printf命令中放置双引号。更好的解决方案是说printf '%s' "${INFO}"但是......你真的需要shell来插值变量INFO的值,如果是这样,为什么你不是简单地做{{1} }?

如果确实只想要替换第一个匹配项,sh 'echo "${INFO#*/}"'标志是多余的,所以我把它取出来了。你的正则表达式被锚定到字符串的开头,所以它只能找到一个匹配的替换,但是当显然不是你想要的东西时,说“替换一行上的所有事件”充其量是误导和混淆。

如果您的测试数据确实不包含冒号,那么正则表达式中的冒号错误,所以我也把它拿出来了。

通常,我们使用不同的分隔符,如/g,因此我们不需要在s%^[^/]*/%%替换中使用反斜杠 - 转义斜杠。