如何通过grep和perl替换字符串
我只想在第一次出现时从一个文件(file.dat)中grep一个字符串,并通过读取另一个文件(output)来替换它。我有一个名为“output”的文件,例如包含“AAA T 0001” 基本上我想要的是: 当第一次从文件“file.dat”中删除字符串“AAA”时,我想用“T 0001”替换“AAA”旁边的第二列和第三列,但仍保持第一列“AAA”不变。上面的脚本似乎不起作用 基本上,“$lin1”和$srt2变量在s/$lin1/$srt2/g中不被理解 例如: 在我的file.dat中,我有一行如何通过grep和perl替换字符串,perl,replace,grep,Perl,Replace,Grep,我只想在第一次出现时从一个文件(file.dat)中grep一个字符串,并通过读取另一个文件(output)来替换它。我有一个名为“output”的文件,例如包含“AAA T 0001” 基本上我想要的是: 当第一次从文件“file.dat”中删除字符串“AAA”时,我想用“T 0001”替换“AAA”旁边的第二列和第三列,但仍保持第一列“AAA”不变。上面的脚本似乎不起作用 基本上,“$lin1”和$srt2变量在s/$lin1/$srt2/g中不被理解 例如: 在我的file.dat中,我有
AAA D ---- CITY COUNTRY
我想要的是:
AAA T 0001 CITY COUNTRY
非常感谢您的评论。Perl在这类任务中表现出色 下面的代码从
输出中读取替换项
,并记住每个键第一次出现时的新字段。使用Perl的就地编辑,程序然后逐行读取输入。必要时,代码将替换字段2和3,并从%replace
中删除键,以便仅替换第一个实例
#! /usr/bin/env perl
use strict;
use warnings;
die "Usage: $0 replacements data-file\n" unless @ARGV == 2;
sub read_replacements {
my($path) = @_;
my %replace;
open my $fh, "<", $path or die "$0: open $path: $!";
while (<$fh>) {
chomp;
my($key,$f2,$f3) = split;
warn "$0: $path:$.: multiple replacements for key '$key'" if $replace{$key};
$replace{$key} = [$f2,$f3];
}
%replace;
}
my %replace = read_replacements shift @ARGV;
$^I = "~"; # in-place editing backup extension
while (<>) {
chomp;
my($key,@rest) = split;
if ($replace{$key}) {
splice @rest, 0, 2 => @{$replace{$key}};
$_ = join(" ", $key, @rest) . $/;
delete $replace{$key};
}
print;
}
#/usr/bin/env perl
严格使用;
使用警告;
die“用法:$0替换数据文件\n”,除非@ARGV==2;
子读单元替换{
我的($path)=@;
我的%replace;
打开我的$fh,“perl-i-e”
{
我的$f=班次(@ARGV);
打开(my$fh,“什么?请在file.dat
和output
中显示数据以及您想要的结果。可能的重复项
#! /usr/bin/env perl
use strict;
use warnings;
die "Usage: $0 replacements data-file\n" unless @ARGV == 2;
sub read_replacements {
my($path) = @_;
my %replace;
open my $fh, "<", $path or die "$0: open $path: $!";
while (<$fh>) {
chomp;
my($key,$f2,$f3) = split;
warn "$0: $path:$.: multiple replacements for key '$key'" if $replace{$key};
$replace{$key} = [$f2,$f3];
}
%replace;
}
my %replace = read_replacements shift @ARGV;
$^I = "~"; # in-place editing backup extension
while (<>) {
chomp;
my($key,@rest) = split;
if ($replace{$key}) {
splice @rest, 0, 2 => @{$replace{$key}};
$_ = join(" ", $key, @rest) . $/;
delete $replace{$key};
}
print;
}
$ cat output
AAA T 0001
$ cat file.dat
AAA D ---- CITY COUNTRY
$ ./replace-first output file.dat
$ cat file.dat
AAA T 0001 CITY COUNTRY
$ cat file.dat~
AAA D ---- CITY COUNTRY
perl -i -e'
{
my $f = shift(@ARGV);
open(my $fh, "<", $f)
or die("Can'\''t open $f: $!\n");
while (<$fh>) {
my ($s,$r) = /^(\S+)\s++(.*)$/;
$repl{$s} = $r;
}
}
while (<>) {
s{^(\S+)\s+\K(\S+\s*\S+)}{ delete($repl{$1}) // $2 }e;
print;
}
' output file.dat