cygwin sed 在 Jenkins 管道中的行为与路径中的 \ 不同
cygwin sed behaves differently in Jenkins Pipeline with \ in Path
使用 Cygwin sed,在 windows 命令提示符下,sed 使用 \\
将路径转换为:例如
C:\>echo 'PATH_TO_SOURCES' | sed 's/PATH_TO_SOURCES/\C:\\WorkArea\\workspace\\sources/g'
将导致 C:\WorkArea\workspace\sources
但是当我必须在 Jenkins 管道中使用它时,路径中需要 \\\
才能将其转换为 single 。这是我必须生成的命令行给我 '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 pipeline
脚本转义了 \
,所以要得到 C:\Program Files\Microsoft
,所以必须使用 \
即 C:\Program Files\Microsoft
。
另一方面,(在 Windows cygwin 64 中观察到)sed
需要 \\
得到 \
正如我原来的 post 中提到的,即
C:\>echo 'PATH_TO_SOURCES' | sed 's/PATH_TO_SOURCES/\C:\\WorkArea\\workspace\\sources/g'
会导致 C:\WorkArea\workspace\sources
所以在 groovy pipeline
中使用 sed,首先 groovy
将在路径字符串中进行转义,然后将结果传递给 sed
,这将再次对字符串进行自己的转义,所以我们必须在我们的路径中添加 \\\
,这将被 groovy
转义并变为 \\
。然后 sed
会转义 \\
到 \
。这是我 posted 的例子,它是这样工作的:
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'
使用 Cygwin sed,在 windows 命令提示符下,sed 使用 \\
将路径转换为:例如
C:\>echo 'PATH_TO_SOURCES' | sed 's/PATH_TO_SOURCES/\C:\\WorkArea\\workspace\\sources/g'
将导致 C:\WorkArea\workspace\sources
但是当我必须在 Jenkins 管道中使用它时,路径中需要 \\\
才能将其转换为 single 。这是我必须生成的命令行给我 '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 pipeline
脚本转义了 \
,所以要得到 C:\Program Files\Microsoft
,所以必须使用 \
即 C:\Program Files\Microsoft
。
另一方面,(在 Windows cygwin 64 中观察到)sed
需要 \\
得到 \
正如我原来的 post 中提到的,即
C:\>echo 'PATH_TO_SOURCES' | sed 's/PATH_TO_SOURCES/\C:\\WorkArea\\workspace\\sources/g'
会导致 C:\WorkArea\workspace\sources
所以在 groovy pipeline
中使用 sed,首先 groovy
将在路径字符串中进行转义,然后将结果传递给 sed
,这将再次对字符串进行自己的转义,所以我们必须在我们的路径中添加 \\\
,这将被 groovy
转义并变为 \\
。然后 sed
会转义 \\
到 \
。这是我 posted 的例子,它是这样工作的:
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'