2009-04-22 19 views
17

Tengo un directorio de archivos para los que me gustaría hacer un filtrado de cadenas "en el lugar" usando Apache Ant (versión 1.7.1 en Linux).¿Filtrado de archivos in situ con Ant?

Por ejemplo, supongamos que en el directorio mydir Tengo archivos foo, bar y baz. Supongamos además que todas las ocurrencias de la expresión regular OLD([0-9]) deben cambiarse a NEW\1, p. OLD2NEW2. (Tenga en cuenta que la tarea Ant replace no funcionará porque no admite el filtrado de expresiones regulares.)

Esta situación de prueba se puede crear con los siguientes comandos Bash (hormiga se llevará a cabo en el directorio actual, es decir, mydir 's directorio padre):

mkdir mydir 
for FILE in foo bar baz ; do echo "A OLD1 B OLD2 C OLD3" > mydir/${FILE} ; done 

Aquí está mi primer intento de hacer el filtrado con Ant:

<?xml version="1.0"?> 
<project name="filter" default="filter"> 
    <target name="filter"> 
     <move todir="mydir"> 
      <fileset dir="mydir"/> 
      <filterchain> 
       <tokenfilter> 
        <replaceregex pattern="OLD([0-9])" replace="NEW\1" flags="g"/> 
       </tokenfilter> 
      </filterchain> 
     </move> 
    </target> 
</project> 

la ejecución de este primer script Ant no tiene ningún efecto sobre los archivos en mydir. El parámetro overwrite es true de forma predeterminada con la tarea Ant move. Incluso jugueteé con la configuración granularity, pero eso no ayudó.

Este es mi segundo intento, que "funciona", pero es un poco molesto debido a la creación temporal de archivos. Esta versión filtra el contenido correctamente, moviendo el contenido de los archivos con un sufijo filtered, entonces el contenido filtrado se "movió de nuevo" con los nombres de archivo originales:

<?xml version="1.0"?> 
<project name="filter" default="filter"> 
    <target name="filter"> 
     <move todir="mydir"> 
      <globmapper from="*" to="*.filtered"/> 
      <fileset dir="mydir"/> 
      <filterchain> 
       <tokenfilter> 
        <replaceregex pattern="OLD([0-9])" replace="NEW\1" flags="g"/> 
       </tokenfilter> 
      </filterchain> 
     </move> 
     <move todir="mydir"> 
      <globmapper from="*.filtered" to="*"/> 
      <fileset dir="mydir"/> 
     </move> 
    </target> 
</project> 

se pueden hacer el primer intento (sin archivos temporales) a ¿trabajo?

+1

+1, pregunta bien escrito –

Respuesta

15

Véase el replace tarea:

<replace 
    dir="mydir" 
    includes="foo, bar, baz"> 
    <replacefilter token="OLD" value="NEW" /> 
</replace> 

o la tarea replaceregexp:

<replaceregexp 
    file="${src}/build.properties" 
    match="OldProperty=(.*)" 
    replace="NewProperty=\1" 
    byline="true"/> 
+0

Gracias, pero resulta que mi pregunta es incompleta. "Simplifiqué" mi código de producción demasiado cuando escribí esta pregunta. Olvidé especificar la necesidad de un filtrado de expresión regular, que no parece ser compatible con el reemplazo (¡corríjanme si me equivoco!). Usted ha dado una gran respuesta para el caso sin la necesidad de expresiones regulares. –

+2

En ese caso, consulte la tarea opcional replaceregexp: http://ant.apache.org/manual/OptionalTasks/replaceregexp.html – Kevin

+1

¡Las tareas opcionales! ¡Genio! Probablemente he examinado las tareas opcionales de Ant dos veces en mi vida. Totalmente olvidé que estaban allí. ¡Gracias! Agregue una nueva respuesta utilizando la tarea replaceregexp, o edite esta respuesta y la aceptaré. Aquí, lo haré fácil para usted (observe las banderas = "g" para capturar todas las ocurrencias):

Cuestiones relacionadas