2012-08-26 26 views
5

Tôi có cụm từ thông dụng với các nhóm chụp phù hợp với những gì tôi muốn trong ngữ cảnh rộng hơn. Sau đó tôi chụp nhóm $1 và sử dụng nó cho các nhu cầu của tôi. Thật dễ dàng.Thay thế nhóm chụp cụ thể thay vì toàn bộ regex trong Perl

Nhưng cách sử dụng nhóm chụp với s/// khi tôi chỉ muốn thay thế nội dung của $1, không phải toàn bộ regex, với sự thay thế của tôi?

Cảm ơn! –f

Trả lời

1

Nếu bạn chỉ cần thay thế một chụp sau đó sử dụng @LAST_MATCH_START@LAST_MATCH_END (với use English, xem perldoc perlvar) cùng với substr có thể là lựa chọn khả thi:

use English qw(-no_match_vars); 
$your_string =~ m/aaa (bbb) ccc/; 
substr $your_string, $LAST_MATCH_START[1], $LAST_MATCH_END[1] - $LAST_MATCH_START[1], "new content"; 
# replaces "bbb" with "new content" 
+0

Cảm ơn rất nhiều, hoạt động! – flohei

+1

Bạn có muốn ghi danh bỏ phiếu không? Cảm ơn. –

12

Như tôi đã hiểu, bạn có thể sử dụng tính năng nhìn về phía trước hoặc phía sau không tiêu thụ các ký tự. Hoặc lưu dữ liệu theo nhóm và chỉ xóa những gì bạn đang tìm kiếm. Ví dụ:

Với nhìn về phía trước:

s/your_text(?=ahead_text)//; 

Phân nhóm dữ liệu:

s/(your_text)(ahead_text)/$2/; 
1

Đây là một câu hỏi cũ nhưng tôi thấy dưới đây dễ dàng hơn để thay thế các dòng bắt đầu bằng >something thành >something_else. Tốt cho việc thay đổi tiêu đề cho các chuỗi fasta

while ($filelines=~ />(.*)\s/g){ 
     unless ($1 =~ /else/i){ 
       $filelines =~ s/($1)/$1\_else/; 
     } 

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