2015-11-04 73 views
-2

我的文件包含100行的Perl編輯文件

1234 ABC 100.0.0.0 
4567 DEF 200.0.0.0 ..... 

我匹配我的文件中的模式。例如搜索4567並將200.0.0.0替換爲500.0.0.0,以便該行現在看起來爲4567 DEF 500.0.0.0

my $file = "$file_path/file.lst"; 
my $newid = "500.0.0.0" 
open MAST, $file or die "Unable to open file.lst: $!"; 
my $new = "$file.tmp.$$"; 
my $bak = "$file.bak"; 
open(NEW, "> $new")   or die "can't open $new: $!"; 

while (<MAST>) { 
my ($pattern,$id) = (split /\s+/, $_)[0,4]; 
     print $_; 
     if ($_ =~ m/^$pattern/) { 
      $_ =~ s/$id/$newid/g; 
     } 
     (print NEW $_)   or die "can't write to $new: $!"; 
} 

close(MAST)     or die "can't close $file: $!"; 
close(NEW)      or die "can't close $new: $!"; 

rename($file, $bak)   or die "can't rename $file to $bak: $!"; 
rename($new, $file)   or die "can't rename $new to $file: $!"; 

我需要做的:
顯示線路變更前和變更在屏幕上後,要求用戶確認,後來與其他東西進行。

請指教。

+2

http://www.perlmonks.org/?node_id=1146888 – choroba

+0

爲什麼你需要確認?這似乎是[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – Sobrique

回答

0

如果你執行你的代碼,它將顯示編譯錯誤,因爲語句沒有在第二行終止。
在shebang line之後,在程序的頂部始終使用use warnings;use strict;

這裏是搜索模式和替換的方式:

#!/usr/bin/perl 
use warnings; 
use strict; 

my $file = "file.txt"; 
my $newid = "500.0.0.0"; 
my @update; 
open my $fh, "<", $file or die $!; 

while (my $line = <$fh>) 
{ 
    my ($pattern, $id) = (split(/\s+/, $line))[0, 2]; #split line to get first and third column value 
    if ($pattern =~ m/4567/) 
    { 
     print "Before change: $line\n";  
     $line =~ s/$id/$newid/g; #replace id with newid when pattern is 4567 
     print "After change: $line\n"; 
     #print "Confirm with Yes or No: "; #here you can for confirmation 
     #chomp(my $confirmation = <STDIN>); 
    } 
    push @update, $line; 
} 
close $fh; 
#modify the file 
open my $fhw, ">", $file or die "Couldn't modify file: $!"; 
print $fhw @update; 
close $fhw; 


----------file.txt---------- 
1234 ABC 100.0.0.0 
4567 DEF 200.0.0.0 

它也將改變之前和變化對控制檯後打印匹配行。您可以根據您的要求修改此代碼。確認部分在你的問題中不是很清楚。

0

未經用戶確認元素,這將做到這一點:

perl -i.bak -pe 'm/^4567/ and s/200/500/' filename 

你,你需要每線用戶確認用戶?你可以通過diff來檢查這是否符合你的要求。