cygwin sed在Jenkins管道中的行为与路径中的不同
使用Cygwin sed,在windows命令提示符下,sed使用cygwin sed在Jenkins管道中的行为与路径中的不同,sed,jenkins-pipeline,cygwin,Sed,Jenkins Pipeline,Cygwin,使用Cygwin sed,在windows命令提示符下,sed使用\\\\将路径转换为:例如 C:\>echo 'PATH_TO_SOURCES' | sed 's/PATH_TO_SOURCES/\C:\\\WorkArea\\\workspace\\\sources/g' 将导致C:\WorkArea\workspace\sources 但当我不得不在Jenkins管道中使用相同的代码时,需要路径中的才能将其转换为单代码。这是我必须生成的命令行,它为我提供了“C:\WorkArea\
\\\\
将路径转换为:例如
C:\>echo 'PATH_TO_SOURCES' | sed 's/PATH_TO_SOURCES/\C:\\\WorkArea\\\workspace\\\sources/g'
将导致C:\WorkArea\workspace\sources
但当我不得不在Jenkins管道中使用相同的代码时,需要路径中的
才能将其转换为单代码。这是我必须生成的命令行,它为我提供了“C:\WorkArea\workspace\sources”
stage('SED')
{
steps {
script {
cfgFile="MyCfg.xml"
dir(AutomationScripts) {
bat (""" cat MyCfg.xml | sed "s/PATH_TO_SOURCES/\C:\\\\\\WorkArea\\\\\\workspace\\\\\\sources/g" > newMyCfg.xml""")
}
}
}
}
更新:我尝试过修改评论中提到的引号,但似乎什么都没有改变。以下是管道(从bat
开始)和结果:
Pipeline: bat (" echo 'PATH_TO_SOURCES' | c:\\cygwin64\\bin\\sed 's/PATH_TO_SOURCES/\\C:\\\\\\WorkArea\\\\\\workspace\\\\\\sources/g' ")
Output: C:\>echo 'PATH_TO_SOURCES' | c:\cygwin64\bin\sed 's/PATH_TO_SOURCES/\C:\\\WorkArea\\\workspace\\\sources/g'
'C:\WorkArea\workspace\sources'
Pipeline: bat (" echo 'PATH_TO_SOURCES' | c:\\cygwin64\\bin\\sed 's/PATH_TO_SOURCES/\\C:\\WorkArea\\workspace\\sources/g'")
Output: C:\>echo 'PATH_TO_SOURCES' | c:\cygwin64\bin\sed 's/PATH_TO_SOURCES/\C:\WorkArea\workspace\sources/g'
'C:WorkAreaworkspacesources'
Pipeline: bat ("""echo 'PATH_TO_SOURCES' | c:\\cygwin64\\bin\\sed "s/PATH_TO_SOURCES/\\C:\\WorkArea\\workspace\\sources/g" """)
Output: C:\>echo 'PATH_TO_SOURCES' | c:\cygwin64\bin\sed "s/PATH_TO_SOURCES/\C:\WorkArea\workspace\sources/g"
'C:WorkAreaworkspacesources'
Pipeline: bat ("echo 'PATH_TO_SOURCES' | c:\\cygwin64\\bin\\sed 's/PATH_TO_SOURCES/\\C:\\\\WorkArea\\\\workspace\\\\sources/g'")
Output: C:\>echo 'PATH_TO_SOURCES' | c:\cygwin64\bin\sed 's/PATH_TO_SOURCES/\C:\\WorkArea\\workspace\\sources/g'
'C:WorkAreaworkspacesources'
Pipeline: bat ("""echo 'PATH_TO_SOURCES' | c:\\cygwin64\\bin\\sed "s/PATH_TO_SOURCES/\\C:\\\\WorkArea\\\\workspace\\\\sources/g" """)
Output: C:\>echo 'PATH_TO_SOURCES' | c:\cygwin64\bin\sed "s/PATH_TO_SOURCES/\C:\\WorkArea\\workspace\\sources/g"
'C:WorkAreaworkspacesources'
尽管如此,这是一个bat调用,其行为应该与在命令提示符下发生的行为相同
看起来管道本身正在泄漏\
你知道我是不是遗漏了什么吗?我意识到
groovy管道脚本会逃逸\
,所以要得到C:\Program Files\Microsoft
,所以必须使用\
即C:\\Program Files\\Microsoft
。
另一方面,(在Windows cygwin 64中观察到)sed
需要\\\
才能获得我在原始帖子中提到的\
,即
C:\>echo'PATH\u TO|u SOURCES';sed's/PATH\u TO|u SOURCES/\C:\\\WorkArea\\\workspace\\\SOURCES/g'
将导致C:\WorkArea\workspace\SOURCES
因此在groovy管道中使用sed
,首先groovy
将在路径字符串中进行转义,然后将结果传递给sed
,sed将再次在字符串上进行自己的转义,因此我们必须在路径中添加
,它将被groovy
转义,并变成\
。然后sed
将\\\
转义为\
。以下是我发布的示例,其工作原理如下:
Pipeline: bat (" echo 'PATH_TO_SOURCES' | c:\\cygwin64\\bin\\sed 's/PATH_TO_SOURCES/\\C:\\\\\\WorkArea\\\\\\workspace\\\\\\sources/g' ")
Output: C:\>echo 'PATH_TO_SOURCES' | c:\cygwin64\bin\sed 's/PATH_TO_SOURCES/\C:\\\WorkArea\\\workspace\\\sources/g'
'C:\WorkArea\workspace\sources'
您在sed表达式周围使用了不同的引号。@DougHenderson,刚刚用引号更新了文章。它似乎没有改变任何事情。。。