cygwin sed在Jenkins管道中的行为与路径中的不同

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\

使用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\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,刚刚用引号更新了文章。它似乎没有改变任何事情。。。