Ant для замены текста файла, который не начинается с

Я хочу создать цель муравья, которая может заменить содержимое файла (или более), который не начинается с определенного шаблона. Есть ли решение для этого с помощью ant и replaceregexp? Или альтернатива этому? Пример:

  • У меня есть файл boot.txt с текстом: «это бу».
  • Также у меня есть файл foo.txt с текстом: «просто foo».

Я хочу изменить текст для foo.txt на: «это просто foo»


person Robert    schedule 05.11.2010    source источник


Ответы (2)


Вероятно, это случай приготовления подходящего регулярного выражения с захватами.

Кажется, это работает для примера, который вы даете.

<property name="prefix" value="this " />
<replaceregexp flags="s" match="^(${prefix})?(.*)" replace="${prefix}\2">
    <fileset dir="files" />
</replaceregexp>
  • Файлы указываются с помощью набора файлов — здесь все файлы в каталоге files.
  • Префикс, который мы хотим добавить, — это this, который хранится в свойстве, так как нам нужно упомянуть его в двух местах.
  • Параметр flags="s" гарантирует, что мы рассматриваем файл как одну строку для целей сопоставления (а не сопоставление каждой строки).
  • Регулярное выражение ищет строку префикса в файле и сохраняет ее в захвате \1, который отбрасывается.
  • Остальная часть строки находится в захвате \2.
  • Замените строку префикса, за которой следует захват \2.

Вы можете подумать, что всегда добавляете префикс, но после удаления префикса, если он уже есть... за исключением того, что replaceregexp задача не записывает файл, если только он не отличается от существующего.

person martin clayton    schedule 05.11.2010
comment
Вау, очень элегантное решение, спасибо! Я нашел что-то похожее, используя осмотр и взгляд вперед, но это проще! - person Robert; 08.11.2010
comment
У вас есть идея, как избежать специальных символов регулярных выражений внутри значения свойства префикса? - person Robert; 08.11.2010

это всего лишь частичный ответ. Я не уверен, что это правильно, но, по крайней мере, может дать вам какое-то направление

для этого вам нужен ant-contrib

    <property name="folder.name" value="some-folder-name" />
    <property name="text.substitution" value="this " />

    <target name="main">
       <foreach target="target2" param="file_path"> 
          <path> 
             <fileset dir="${folder.name}" casesensitive="no" /> 
          </path> 
       </foreach>
    </target>

<target name="target2">
    <loadfile property="message" srcFile="${file_path}"/>
        <!-- f message doesnt have text.substitution at the begging -->
        <!-- not sure if this is correct regex -->
        <propertyregex property="myprop" input="${message}" 
                      regexp="([^b]+)" select="\0" casesensitive="false" /> 
    <if>
        <equals arg1="${myprop}" arg2="{text.substitution}" />      
    <then>
        <concat destfile="foo.txt" append="true">${text.substitution} </concat>  
    </then>
    </if>
</target>
person trix    schedule 05.11.2010