2010-10-31 9 views
5

En mi build.xml, quiero hacer el equivalente a cmd1 | xargs cmd2 (y también almacenar la lista de archivos de cmd1 en la variable ${dependencies}), donde cmd1 proporciona una lista de rutas separada por una nueva línea. No puedo entender cómo hacer esto en Ant.Cómo reemplazar newline en hormiga en outputfilterchain?

<project default="main"> 
    <target name="main"> 
     <exec executable="echo" 
      outputproperty="dependencies"> 
      <arg value="closure/a.js&#xa;closure/b.js&#xa;closure/c.js"/> 
      <redirector> 
       <outputfilterchain> 
        <replacestring from="${line.separator}" to=" "/> 
        <!-- None of these do anything either: 
        <replacestring from="\n" to=" "/> 
        <replacestring from="&#xa;" to=" "/> 
        <replaceregex pattern="&#xa;" replace=" " flags="m"/> 
        <replaceregex pattern="\n" replace=" " flags="m"/> 
        <replaceregex pattern="${line.separator}" replace=" " flags="m"/> 
        --> 
       </outputfilterchain> 
      </redirector> 
     </exec> 
     <!-- Later, I need to use each file from ${dependencies} as an argument 
      to a command. --> 
     <exec executable="echo"> 
      <!--This should turn into 3 arguments, not 1 with newlines.--> 
      <arg line="${dependencies}"/> 
     </exec> 
    </target> 
</project> 

Respuesta

6

Este filtro podría hacer por la primera parte, aunque asume que ninguno de sus archivos comienza con un carácter de espacio.

<outputfilterchain> 
    <prefixlines prefix=" " /> 
    <striplinebreaks /> 
    <trim /> 
</outputfilterchain> 

añade el prefijo cada línea con un espacio, a continuación, elimina los saltos de línea - dando una sola línea con todos los nombres de archivo separados por espacios individuales, pero con un espacio al principio. Entonces, el trim se usa para cortarlo.

2

Gracias martin. También encontré otra solución al leer el filterchain documentation con más cuidado.

<outputfilterchain> 
    <tokenfilter delimoutput=" "> 
     <!--The following line can be omitted since it is the default.--> 
     <linetokenizer/> 
    </tokenfilter> 
</outputfilterchain>