2012-02-07 23 views
15

Tôi có một số dữ liệu đầu ra từ một số lệnh Bash Shell. Đầu ra được phân tách bằng dòng với "\ n" hoặc "\ 0". Tôi muốn biết rằng có cách nào để ống đầu ra vào Perl và xử lý các dòng dữ liệu theo dòng trong Perl (giống như đường ống đầu ra để awk, nhưng trong trường hợp của tôi nó là trong bối cảnh Perl.). Tôi cho rằng các lệnh có thể được một cái gì đó như thế này:Làm thế nào để đường ống của dòng lệnh Bash Shell bằng dòng Perl để xử lý Regex?

Bash Shell command | perl -e 'some perl commands' | another Bash Shell command 

Giả sử tôi muốn thay thế tất cả ":" nhân vật để "@" nhân vật trong một "từng dòng" cơ sở (không phải là một thay thế toàn cầu, tôi có thể sử dụng một điều kiện, ví dụ như dòng lẻ hoặc chẵn, để xác định xem dòng hiện tại có nên thay thế hay không.), thì làm cách nào tôi có thể đạt được điều này.

Trả lời

20

Xem perlrun.

perl -lpe's/:/@/g'  # assumes \n as input record separator 
perl -0 -lpe's/:/@/g' # assumes \0 as input record separator 

perl -lne'if (0 == $. % 2) { s/:/@/g; print; }' # modify and print even lines 

Có, Perl có thể xuất hiện ở bất kỳ vị trí nào trong đường ống, giống như lúng túng.

+0

Cảm ơn rất nhiều. Nó hoạt động. – user1129812

4

Công tắc dòng lệnh -p (nếu bạn muốn in tự động) hoặc -n (nếu bạn không muốn) sẽ làm những gì bạn muốn. Nội dung dòng là trong $ _ vậy:

perl -pe's/\./\@/g'

sẽ là một giải pháp. Nói chung, bạn muốn đọc lên nhà điều hành '<>' (kim cương) là cách để đi cho những người không phải là oneliner.

+2

Điều này cũng yêu cầu cờ -e nếu bạn đang viết toàn bộ chương trình trên dòng lệnh. (nếu không nó sẽ không tìm thấy kịch bản Perl có tiêu đề "s /\./\@/ g") – SkryneSaver

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