如何通过grep和perl替换字符串

如何通过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中,我有

我只想在第一次出现时从一个文件(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