Perl编辑文件

时间:2015-11-04 09:27:14

标签: regex perl

我的文件包含100行

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: $!";

Gradle 1.7

我需要做什么:
在更改前和屏幕上更改后显示行,并要求用户确认并稍后继续处理其他事项。

请建议。

2 个答案:

答案 0 :(得分: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

它还会在更改前和控制台上更改后打印匹配的行。您可以根据需要修改此代码。确认部分在你的问题中不是很清楚。

答案 1 :(得分:0)

如果没有用户确认元素,则会执行此操作:

diff

您是否需要每位用户确认?您可以使用{{1}}检查这是否符合您的要求。