2010-04-11 26 views
22

tôi không thể có được chỉnh sửa tại chỗ Perl một lớp lót chạy dưới ActivePerl làm việc trừ khi tôi xác định chúng có phần mở rộng sao lưu:Tại sao tôi phải chỉ định chuyển đổi -i với phần mở rộng sao lưu khi sử dụng ActivePerl?

C:\> perl -i -ape "splice (@F, 2, 0, q(inserted text)); $_ = qq(@F\n);" file1.txt 
Can't do inplace edit without backup. 

Lệnh cùng với -i.bak hoặc -i.orig một công trình xử nhưng tạo ra một tập tin sao lưu không mong muốn trong quá trình.

Có cách nào khác không?

Trả lời

29

Đây là giới hạn Windows/MS-DOS. Theo số perldiag:

Bạn đang sử dụng hệ thống như MS-DOS bị nhầm lẫn nếu bạn thử đọc từ tệp đã bị xóa (nhưng vẫn mở). Bạn phải nói -i.bak, hoặc một số như vậy.

Việc triển khai 01lcủa Perl khiến nó xóa file1.txt trong khi vẫn giữ một tay cầm mở, sau đó tạo lại tệp có cùng tên. Điều này cho phép bạn 'read' file1.txt mặc dù nó đã bị xóa và đang được tái tạo. Thật không may, Windows/MS-DOS không cho phép bạn xóa một tập tin có một xử lý mở gắn liền với nó, do đó, cơ chế này không hoạt động.

Ảnh đẹp nhất của bạn là sử dụng -i.bak và sau đó xóa tệp sao lưu. Điều này ít nhất mang lại cho bạn một số bảo vệ - ví dụ, bạn có thể chọn không xóa bản sao lưu nếu perl thoát với mã thoát khác 0. Một cái gì đó như:

perl -i.bak -ape "splice...." file1.txt && del file1.bak 
+0

Vì vậy, đó là giới hạn của Windows. Tôi đã hy vọng rằng tôi sẽ không phải 'bỏ liên kết' bản sao lưu với một lệnh riêng biệt ... có vẻ như tôi sẽ phải làm vậy. Cảm ơn đã giúp đỡ. – Zaid

+0

Không hoàn toàn liên quan, nhưng tại chỗ chỉnh sửa trên sed trong cửa sổ dường như làm việc cho tôi. Tôi có thể thấy rằng ví dụ của bạn sẽ không làm việc trong sed, nhưng nó có thể hữu ích để biết. – Mike

+0

@Mike: Cuối cùng, tính năng chỉnh sửa tại chỗ của chúng tôi để lại các tệp tạm thời như ví dụ: 'sedGihEwg' trong hệ thống tập tin - của bạn không? Bạn đã nhận được phiên bản nào? Tôi đang sử dụng 'GNU sed phiên bản 4.2.1'. – zb226

0

Mẫu có sửa đổi đệ quy và xóa cả hai được thực hiện bằng cách tìm. Hoạt động trên ví dụ: mingw git bash trên cửa sổ.

$ find . -name "*.xml" -print0 | xargs -0 perl -p -i.bak -e 's#\s*<property name="blah" value="false" />\s*##g' 
$ find . -name "*.bak" -print0 | xargs -0 rm 

Giá trị kết thúc nhị phân được chuyển giữa tìm/xargs để xử lý dấu cách. Tiền tố s/không bình thường để tránh xé xml trong thuật ngữ tìm kiếm. Điều này giả định bạn không có bất kỳ tệp nào .bak treo xung quanh để bắt đầu.

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