проблема с использованием replaceregexp при замене расположения строки DIR - PullRequest
3 голосов
/ 10 ноября 2011

У меня проблемы с этим. есть 1 пакетный файл с этой строкой:

set TEST_DIR = C: \ temp \ dir1

Я просто хочу установить новое значение в TEST_DIR

Но, когда я использую в своем скрипте муравей, он избегает косой черты и дает такой результат:

set TEST_DIR = C: homedir2

Вместо этого я хочу дать это:

set 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" />

Ответы [ 2 ]

6 голосов
/ 10 ноября 2011

Вы можете получить желаемый результат, используя этот шаблон замены:

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

Причина в том, что вы должны экранировать обратную косую черту один раз для регулярного выражения и один раз для Java - обратная косая черта является escape-символом в обоих этих контекстах.

В ответ на ваши последующие вопросы в комментариях ...

  1. Я ожидаю, что ответ будет таким же. Вам нужно будет дважды использовать обратную косую черту в значении ${new_loc}, то есть использовать C:\\\\my_projcode, а не C:\my_projcode.

  2. Если new_loc входит в качестве переменной среды, вы можете использовать задачу propertyregex из ant-contrib для экранирования обратной косой черты в значении:

    <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:\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
5 голосов
/ 11 ноября 2011

Я нашел другое простое решение: replace вместо replaceregexp .

<replace file="${MT_BATCH_FILE_LOCATION}\myfile.bat"
                            token='TEST_DIR=C:\temp\dir1'
                    value='TEST_DIR=${new_loc}\home\dir2' />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...