2012-05-03 35 views
13

Tôi đang sử dụng Perl để tìm kiếm và thay thế nhiều biểu thức thông thường: Khi tôi thực hiện lệnh sau, tôi nhận được một lỗi:Perl tìm kiếm dòng lệnh và thay thế bằng nhiều biểu

prompt> find "*.cpp" | xargs perl -i -pe 's/##(\W)/\1/g' -pe 's/(\W)##/\1/g' 
syntax error at -e line 2, near "s/(\W)##/\1/g" 
Execution of -e aborted due to compilation errors. 
xargs: perl: exited with status 255; aborting 

Có nhiều -e là hợp lệ trong Perl, vậy tại sao điều này không hoạt động? Có một giải pháp cho điều này?

+0

Bạn có thể thay thế hai regex đó bằng một thay đổi: 's/## (? = \ W) | (? <= \ W) ## // g' – TLP

+0

@TLP Tôi là một noob đối với Perl; xin vui lòng bạn có thể giải thích những gì hiện? = và? <= có nghĩa là bối cảnh này? –

+0

Chúng là các xác nhận xung quanh, bạn có thể đọc thêm về chúng trong [perldoc perlre] (http://perldoc.perl.org/perlre.html#Look-Around-Assertions). Chúng có chiều rộng bằng 0, vì vậy chúng chỉ kiểm tra và không loại bỏ. – TLP

Trả lời

29

Một số được phép của -e.

Bạn đang thiếu ';'

find "*.cpp" | xargs perl -i -pe 's/##(\W)/\1/g;' -pe 's/(\W)##/\1/g;' 

báo cáo Perl đã kết thúc với ;. Câu lệnh cuối cùng trong một khối không cần chấm dứt dấu chấm phẩy. Vì vậy, một đơn -e mà không cần ; sẽ hoạt động, nhưng bạn sẽ phải thêm ; khi bạn có nhiều câu hỏi -e.

+0

Cảm ơn bạn rất nhiều vì đã trả lời. Tôi đã ở cuối trí thông minh của tôi cố gắng tìm ra điều này. –

+5

Hoặc 'xargs perl -i -pe 's/## (\ W)/\ 1/g; s/(\ W) ##/\ 1/g; '' –

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