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



我在做这件事时有麻烦。有这样一行的批处理文件:

设置TEST_DIR = C: temp dir1

我想给TEST_DIR设置一个新值

但是,当我在ant脚本中使用时,它转义正斜杠并给出如下结果:

设置TEST_DIR = C: homedir2

相反,我想给它:

设置TEST_DIR = C: 家庭 dir2

我正在使用这个命令:

<replaceregexp file="${MT_BATCH_FILE_LOCATION}myfile.bat" match="TEST_DIR=C:\temp\dir1" replace="TEST_DIR=C:homedir2" byline="true" />

您可以使用下面的替换模式来获得您想要的结果:

 replace="TEST_DIR=C:\\home\\dir2"

原因是必须对正则表达式和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>
    

输出:

c:tmpant>set new_loc=c:foobar
c:tmpant>ant
Buildfile: c:tmpantbuild.xml
test:
     [echo] new_loc: c:foobar
     [echo] env.new_loc: c:foobar
     [echo] loc: c:\\foo\\bar
BUILD SUCCESSFUL
Total time: 0 seconds
c:tmpant>type test.bat
set TEST_DIR=c:foobarhomedir2

我发现了另一个简单的解决方案,使用替换而不是replaceregexp

<replace file="${MT_BATCH_FILE_LOCATION}myfile.bat"
                            token='TEST_DIR=C:tempdir1'
                    value='TEST_DIR=${new_loc}homedir2' />

最新更新