我有一些简短的脚本,如下所示: 这是一种在groovy命令中执行bash的方法。
sh (script: 'printf "${INFO} | sed 's/^[^\/]*://g'"',returnStdout: true).trim()
INFO
的值为test/word/fine
。
使用上面的脚本,我想“删除”所有内容,直到(并包括)第一个/
。我无法使用单引号之间的单引号。如果可行,我可以检查我的\/
是否有效。
答案 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%^[^/]*/%%
替换中使用反斜杠 - 转义斜杠。