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. OLD2
→ NEW2
. (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, pregunta bien escrito –