2009-04-22 10 views
17

Mam katalog plików, dla których chciałbym wykonać filtrowanie ciągów "w miejscu" przy użyciu Apache Ant (wersja 1.7.1 w systemie Linux).Filtrowanie plików w miejscu za pomocą mrówki?

Załóżmy na przykład, że w katalogu mydir mam pliki foo, bar i baz. Ponadto przypuśćmy, że wszystkie wystąpienia wyrażenia regularnego OLD([0-9]) powinny zostać zmienione na NEW\1, np. OLD2NEW2. (Zauważ, że zadanie an Ant replace nie będzie działało, ponieważ nie obsługuje filtrowania wyrażeń regularnych.)

Ta sytuacja testowa może zostać utworzona za pomocą następujących komend Bash (ant zostanie uruchomione w bieżącym katalogu, tzn. mydir katalog nadrzędny):

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

Oto moja pierwsza próba zrobienia filtrowanie z 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> 

Uruchomienie tego pierwszego Ant skrypt nie ma wpływu na pliki w mydir. Parametr overwrite jest domyślnie ustawiony na true przy pomocy zadania Ant z numerem move. Nawet bawiłem się ustawieniem granularity, ale to nie pomogło.

Oto moja druga próba, która "działa", ale jest nieco irytująca z powodu tymczasowego tworzenia plików. Wersja ta filtruje zawartość odpowiednio przesuwając zawartość do plików z filtered sufiksu, następnie filtrowana zawartość jest „wrócił” z oryginalnymi nazwami:

<?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> 

Czy pierwsza próba (bez plików tymczasowych) należy wprowadzić do praca?

+1

+1, dobrze pisemne pytanie –

Odpowiedz

15

Patrz zadanie replace:

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

lub zadania replaceregexp:

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

Dzięki, ale okazuje się, że moje pytanie jest niekompletne. Ja "upraszczałem" swój kod produkcyjny zbyt wiele, gdy pisałem to pytanie. Zaniedbałem, aby określić potrzebę filtrowania wyrażeń regularnych, które zastąpienie nie wydaje się wspierać (proszę mnie poprawić, jeśli się mylę!). Dałeś świetną odpowiedź na sprawę bez potrzeby regularnych wyrażeń. –

+2

W takim przypadku zobacz opcjonalne zadanie replaceeregexp: http://ant.apache.org/manual/OptionalTasks/replaceregexp.html – Kevin

+1

Opcjonalne zadania! Geniusz! Prawdopodobnie dwa razy w życiu przeglądałem zadania opcjonalne Ant. Całkowicie zapomniałem, że tam byli. Dzięki! Dodaj nową odpowiedź za pomocą zadania replaceeregexp lub edytuj tę odpowiedź, a ja ją zaakceptuję. Tutaj ułatwię ci (zauważ flagi = "g", aby wychwycić wszystkie wystąpienia):

Powiązane problemy