2011-10-27 32 views
7

Tôi đang cố gắng tìm <li ><a href='xxxxxxxx'>some_link</a></li> và thay thế bằng không có gì. Để làm điều này, tôi đang chạy lệnh dưới đây nhưng nó nhận ra $ như là một phần của một regex.Perl một lớp lót để tìm và thay thế trong một tệp có biến số

perl -p -i -e 's/<li ><a href=.*$SOMEVAR.*li>\n//g' file.html

Tôi đã thử những điều sau đây,
${SOMEVAR}
\$SOMEVAR
FIND="<li ><a href=.*$SOMEVAR.*li>"; perl -p -i -e 's/$FIND//g' file.html

Bất kỳ ý tưởng? Cảm ơn.

+0

Cảm ơn đã khiến tôi nhìn lên những gì mà 'cờ -i' làm. Thật là tuyệt. Mẹo chuyên nghiệp: bạn có thể đặt tất cả các cờ với nhau như thế này: '-pie' – Chriszuma

+0

Ngoài ra, kudo trên một bài đăng đầu tiên vững chắc. Vấn đề được mô tả chính xác, cùng với các giải pháp đã thử. Làm tốt. – Chriszuma

+1

@Chriszuma bạn đã thử kết hợp -pie thực sự chưa? – tadmc

Trả lời

8

Bash chỉ thực hiện thay thế biến với dấu ngoặc kép.

này nên làm việc:

perl -p -i -e "s/<li ><a href=.*?$SOMEVAR.*?li>\n//g" file.html 

EDIT Trên thực tế, có thể hành động kỳ lạ với \n trong đó. Một cách tiếp cận khác là tận dụng chuỗi nối của Bash. Điều này sẽ làm việc:

perl -p -i -e 's/<li ><a href=.*?'$SOMEVAR'.*?li>\n//g' file.html 

EDIT 2: Tôi chỉ cần lấy một cái nhìn sâu hơn về những gì bạn đang cố gắng để làm, và đó là loại nguy hiểm. Bạn đang sử dụng hình thức greedy của .*, có thể khớp với nhiều văn bản hơn bạn muốn. Sử dụng .*? để thay thế. Tôi cập nhật các regexes ở trên.

1

Nếu "someVar" thực sự là một biến bên ngoài, bạn có thể xuất nó đối với môi trường và tham khảo nó như sau:

SOMEVAR=whatever perl -p -i -e 's/<li ><a href=.*$ENV{SOMEVAR}.*li>\n//g' file.html 
Các vấn đề liên quan