我有一个包含
等条目的文件--ERROR--- Failed to execute the command with employee Name="shayam" Age="34"
--Successfully executed the command with employee Name="ram" Age="55"
--ERROR--- Failed to execute the command with employee Name="sam" Age="23"
--ERROR--- Failed to execute the command with employee Name="yam" Age="3"
我只需要提取命令执行失败的人的姓名和年龄。 在这种情况下,我需要提取shayam 34 sam 23 yam 3.我需要在perl中执行此操作。非常感谢..
答案 0 :(得分:21)
作为一个单行:
perl -lne '/^--ERROR---.*Name="(.*?)" Age="(.*?)"/ && print "$1 $2"' file
答案 1 :(得分:17)
perl -p -e's /../../ g'file
或内联替换:
perl -pi -e's /../../ g'file
答案 2 :(得分:6)
你的头衔不清楚。总之...
while(<>) {
next if !/^--ERROR/;
/Name="([^"]+)"\s+Age="([^"]+)"/;
print $1, " ", $2, "\n";
}
可以从stdin读取;当然,您可以将阅读循环更改为其他任何内容,并使用某些内容来打印哈希或根据您的需要填写任何内容。
答案 3 :(得分:5)
作为一个班轮,试试:
perl -ne 'print "$1 $2\n" if /^--ERROR/ && /Name="(.*?)"\s+Age="(.*?)"/;'
这很像使用sed,但使用Perl语法。
答案 4 :(得分:2)
“我如何使用像sed这样的perl?”的直接问题。最好用s2p回答,sed转换为perl转换器。给定命令行“sed $ script”,只需调用“s2p $ script”来生成(通常是不可读的)perl脚本,该脚本模拟给定命令集的sed。
答案 5 :(得分:-3)
参考评论:
my @a = <>; # Reading entire file into an array
chomp @a; # Removing extra spaces
@a = grep {/ERROR/} @a; # Removing lines that do not contain ERROR
# mapping with sed-like regexp to keep only names and ages :
@a = map {s/^.*Name=\"([a-z]+)\" Age=\"([0-9]+)\".*$/$1 $2/; $_} @a;
print join " ",@a; # print of array content