2009-04-22 29 views
17

Tôi có một thư mục chứa các tệp mà tôi muốn thực hiện việc lọc chuỗi "tại chỗ" bằng cách sử dụng Apache Ant (phiên bản 1.7.1 trên Linux).Lọc tệp tại chỗ với kiến?

Ví dụ: giả sử rằng trong thư mục mydir Tôi có các tệp foo, barbaz. Giả sử thêm rằng tất cả các lần xuất hiện của cụm từ thông dụng OLD([0-9]) phải được đổi thành NEW\1, ví dụ: OLD2NEW2. (Lưu ý rằng tác vụ Ant replace Ant sẽ không hoạt động vì nó không hỗ trợ lọc biểu thức chính quy.)

Tình huống thử này có thể được tạo bằng các lệnh Bash sau đây (ant sẽ được chạy trong thư mục hiện tại, tức là mydir 's thư mục cha):

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

đây là nỗ lực đầu tiên của tôi để làm các việc lọc với 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> 

Chạy script Ant đầu tiên này không ảnh hưởng đến các tập tin trong mydir. Tham số overwritetrue theo mặc định với nhiệm vụ move Ant. Tôi thậm chí còn nghịch ngợm với thiết lập granularity, nhưng điều đó không giúp được gì.

Đây là nỗ lực thứ hai của tôi, "hoạt động", nhưng hơi khó chịu do việc tạo tệp tạm thời. Phiên bản này các bộ lọc nội dung đúng cách bằng cách di chuyển nội dung các tập tin với một hậu tố filtered, sau đó nội dung được lọc là "lùi lại" với tên tệp gốc:

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

những nỗ lực đầu tiên (không có tập tin tạm thời) có thể được thực hiện để công việc?

+1

+1, cũng như các văn bản câu hỏi –

Trả lời

15

Xem replace nhiệm vụ:

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

hoặc replaceregexp nhiệm vụ:

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

Cảm ơn, nhưng nó chỉ ra rằng câu hỏi của tôi là không đầy đủ. Tôi "đơn giản hóa" mã sản xuất của tôi quá nhiều khi tôi viết câu hỏi này. Tôi bỏ qua để xác định sự cần thiết phải lọc biểu thức chính quy, mà thay thế không xuất hiện để hỗ trợ (xin vui lòng sửa tôi nếu tôi là sai!). Bạn đã đưa ra một câu trả lời tuyệt vời cho trường hợp mà không cần phải thể hiện thường xuyên. –

+2

Trong trường hợp đó, hãy xem tác vụ tùy chọn replaceregexp: http://ant.apache.org/manual/OptionalTasks/replaceregexp.html – Kevin

+1

Các tác vụ tùy chọn! Thiên tài! Tôi đã có thể xem xét các nhiệm vụ tùy chọn Ant hai lần trong cuộc đời của tôi. Hoàn toàn quên họ đã ở đó. Cảm ơn! Vui lòng thêm câu trả lời mới bằng cách sử dụng tác vụ replaceregexp hoặc chỉnh sửa câu trả lời này và tôi sẽ chấp nhận câu trả lời đó. Ở đây, tôi sẽ giúp bạn dễ dàng hơn (chú ý cờ = "g" để bắt tất cả các lần xuất hiện):

Các vấn đề liên quan