2011-08-09 40 views
34

Tôi muốn thay thế từ "xanh" thành "đỏ" trong tất cả các tệp văn bản có tên là 1_classification.dat, 2_classification.dat, v.v. Tôi muốn chỉnh sửa cùng một tệp vì vậy tôi đã thử mã này nhưng nó không hoạt động. Tôi làm sai ở đâu?Làm thế nào để thay thế một chuỗi trong một tệp hiện có trong Perl?

@files=glob("*_classification.dat"); 
foreach my $file (@files) 
{ 
    open(IN,$file) or die $!; 
    <IN>; 
    while(<IN>) 
    { 
     $_='~s/blue/red/g'; 
     print IN $file; 
    } 

    close(IN) 
} 

Trả lời

92

Bất cứ điều gì sai với một lớp lót?

$ perl -pi.bak -e 's/blue/red/g' *_classification.dat 

Giải thích

  • -p quy trình, sau đó in <> từng dòng
  • -i kích hoạt chỉnh sửa tại chỗ. Tập tin được sao lưu bằng cách sử dụng phần mở rộng .bak
  • Các hành vi thay regex trên biến tiềm ẩn, đó là những nội dung của file, line-by-line
+6

Dấu ngoặc kép nếu lệnh này chạy dưới Windows – Zaid

+0

Có hoặc không có dấu ngoặc kép nào nếu mã không chứa dấu cách. – bart

+4

Sử dụng '*' globbing trong đối số dường như không hoạt động trong cửa sổ. – TLP

10

$_='~s/blue/red/g';

Uh, gì??

Chỉ

s/blue/red/g; 

hoặc, nếu bạn nhấn mạnh vào việc sử dụng một biến (đó là không cần thiết khi sử dụng $ _, nhưng tôi chỉ muốn thể hiện đúng cú pháp):

$_ =~ s/blue/red/g; 
2

Không các câu trả lời hiện có ở đây đã cung cấp một ví dụ hoàn chỉnh về cách thực hiện điều này từ bên trong một tập lệnh (không phải một lớp lót). Dưới đây là những gì tôi đã làm:

rename($file, $file.'.bak'); 
open(IN, '<'.$file.'.bak') or die $!; 
open(OUT, '>'.$file) or die $!; 
while(<IN>) 
{ 
    $_ =~ s/blue/red/g; 
    print OUT $_; 
} 
close(IN); 
close(OUT); 
Các vấn đề liên quan