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'