3

我有一个文件和一行文件看起来像这样

GIVEN=David Smith
GIVEN=John Doe Young
GIVEN=Ms Sam Parker
GIVEN=Mr James Free Foo ABC
GIVEN=Joe Cam-Barr

我只想找到任何以开头的行GIVEN并找到最后一个空格字符(假设是姓氏),然后换行。

所以输入=

FOO=Bar
GIVEN=David Smith
Baz=123

输出应该是

FOO=Bar
GIVEN=David
LAST=Smith
Baz=123

这是我所能得到的:

(?<=(GIVEN=))(.*\ )

见这里演示http://regexr.com?30uh8

4

4 回答 4

1
open(my $IN, "<infile.txt") or die $!;
chomp(my @lines = <$IN>);
close $IN;

foreach(@lines){
  s/^(GIVEN\=.+)\s+(\S+)$/$1\nLAST=$2/;
}

open(my $OUT,">outfile.txt") or die $!;
print "$_\n" foreach(@lines);
close $OUT;

应该管用。如果输入文件非常大,则根据需要逐行读取。

于 2012-05-14T03:57:50.670 回答
1
awk ' /^GIVEN=/ {last=$NF; $NF=""; print; print "LAST=" last; next} 1' filename
于 2012-05-14T10:29:29.990 回答
1

substrrindex运算符专为此任务而设计。rindex查找从字符串右侧开始的字符第一次出现的位置,并且substr采用位置和长度来插入子字符串:

这个substr作用于$_,从 给出的位置开始rindex,用 替换下一个1字符\nLAST=

while( <> ) {
    substr( $_, rindex( $_, ' ' ), 1, "\nLAST=" ) if /\AGIVEN=/;
    print;
    }

当您查看此代码时,您会发现它已经是单行代码所需的形式,尽管在这种情况下,我使用通用引用来避免 shell 插值问题:

% perl -pi.old -e 'substr($_,rindex($_,q( )),1,qq(\nLAST=)) if /\AGIVEN=/' ...

然而,这可能会破坏某些人的名字。不是每个姓氏都是一个词。询问此人是了解其姓氏的唯一好方法。

于 2012-05-14T19:50:43.340 回答
0
thames.434> cat file
    FOO=Bar
    GIVEN=David Smith
    Baz=123

thames.435> awk '{if ($0~/GIVEN/){x=$2;$2="";print;print "LAST=",x}else print}' file
    FOO=Bar
GIVEN=David 
LAST= Smith
    Baz=123
于 2012-05-14T11:18:52.923 回答