2010-08-28 39 views
7

Tôi có một tập tin có chứa rất nhiều nhữngTôi đang làm gì sai trong lớp lót Perl này?

"/watch?v=VhsnHIUMQGM" 

và tôi muốn đầu ra mã thư bằng cách sử dụng perl one-liner. Vì vậy, tôi thử

perl -nle 'm/\"\/watch\?v=(.*?)\"/g' filename.txt 

nhưng không in được gì.

Tôi đang làm gì sai?

+1

Xem ['perldoc perlrun'] (http://perldoc.perl.org/perlrun.html) –

Trả lời

13

Tùy chọn -n xử lý từng dòng nhưng không in bất kỳ thứ gì. Vì vậy, bạn cần phải thêm print rõ ràng nếu bạn kết hợp thành công.

perl -ne 'while (m/\"\/watch\?v=(.+?)\"/g) { print "$1\n" }' filename.txt 

cách tiếp cận khác, nếu bạn chắc chắn mỗi dòng sẽ phù hợp, là để sử dụng tùy chọn -p mà in ra giá trị của $_ sau khi chế biến, ví dụ:

perl -pe 's/\"\/watch\?v=(.+?)\"/$1//' filename.txt 
1

Bạn có thể chia chuỗi trên "=" thay vì đối sánh:

perl -paF= -e '$_= @F[1]' filename.txt 
6

Regex của bạn là tốt. Bạn không nhận được kết quả đầu ra vì tùy chọn -n sẽ không in bất kỳ thứ gì. Nó chỉ đơn giản là kết thúc một vòng lặp while (<>) { ... } xung quanh chương trình của bạn (chạy perl --help để giải thích ngắn gọn về các tùy chọn Perl).

Sau đây sử dụng regex của bạn, nhưng thêm một số bản in. Trong ngữ cảnh danh sách, các regex với tùy chọn /g trả về tất cả các ảnh chụp. Có hiệu quả, chúng tôi in mỗi lần chụp.

perl -nle 'print for m/\"\/watch\?v=(.*?)\"/g' data.dat 
+0

Có đáng để thêm' \ n' để các ảnh chụp được tách riêng không? –

+0

@PP Tùy chọn '-l' xử lý điều đó. – FMc

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