替换字符串DIR位置时使用replaceregexp时出现问题

use*_*728 3 ant

我这样做有困难.这行有1个批处理文件:

设置TEST_DIR = C:\ temp\dir1

我只想为TEST_DIR设置一些新值

但是,当我在我的蚂蚁脚本中使用时,它会转义正斜杠并给出以下结果:

设置TEST_DIR = C:homedir2

相反,我想给它:

设置TEST_DIR = C:\ home\dir2

我正在使用此命令:

<replaceregexp file="${MT_BATCH_FILE_LOCATION}\myfile.bat" match="TEST_DIR=C:\\temp\\dir1" replace="TEST_DIR=C:\home\dir2" byline="true" />
Run Code Online (Sandbox Code Playgroud)

sud*_*ode 6

您可以使用此替换模式获得所需的结果:

 replace="TEST_DIR=C:\\\\home\\\\dir2"
Run Code Online (Sandbox Code Playgroud)

原因是你必须为正则表达式转义一次反斜杠,一次转义为Java - 反斜杠在这两种情况下都是转义字符.

在评论中回答你随后的问题......

  1. 我希望答案是一样的.您将需要双重转义反斜杠的值${new_loc},即C:\\\\my_projcode不使用C:\my_projcode.

  2. 如果new_loc作为环境变量进入,您可以使用ant-contrib中的propertyregex任务来转义值中的反斜杠:

    <project default="test">
    
      <!-- import ant-contrib --> 
      <taskdef resource="net/sf/antcontrib/antlib.xml">
        <classpath>
          <pathelement location="C:/lib/ant-contrib/ant-contrib-1.0b3.jar"/>
        </classpath>
      </taskdef>
    
      <target name="test">
    
        <!-- load environment variables -->
        <property environment="env"/>
    
        <!-- escape backslashes in new_loc -->
        <propertyregex property="loc" input="${env.new_loc}" regexp="\\" replace="\\\\\\\\\\\\\\\\" />
    
        <echo message="env.new_loc: ${env.new_loc}"/>
        <echo message="loc: ${loc}"/>
    
        <!-- do the replace --> 
        <replaceregexp file="test.bat" match="TEST_DIR=C:\\temp\\dir1" replace="TEST_DIR=${loc}\\\\home\\\\dir2" byline="true" />
    
      </target>
    
    Run Code Online (Sandbox Code Playgroud)

输出:

c:\tmp\ant>set new_loc=c:\foo\bar

c:\tmp\ant>ant
Buildfile: c:\tmp\ant\build.xml

test:
     [echo] new_loc: c:\foo\bar
     [echo] env.new_loc: c:\foo\bar
     [echo] loc: c:\\\\foo\\\\bar

BUILD SUCCESSFUL
Total time: 0 seconds

c:\tmp\ant>type test.bat
set TEST_DIR=c:\foo\bar\home\dir2
Run Code Online (Sandbox Code Playgroud)


use*_*728 5

我发现另一个简单的解决方案是使用replace而不是replaceregexp.

<replace file="${MT_BATCH_FILE_LOCATION}\myfile.bat"
                            token='TEST_DIR=C:\temp\dir1'
                    value='TEST_DIR=${new_loc}\home\dir2' />
Run Code Online (Sandbox Code Playgroud)