2010-07-01 59 views
3

我有了像如何使用perl像sed?

--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" 

我只提取那些人命令执行被失败的姓名和年龄的一些条目的文件。 在这种情况下,我需要提取山丹34山姆23山药3.我需要在Perl中做到这一点。非常感谢..

回答

6

您的标题说明不清楚。无论如何...

while(<>) { 
next if !/^--ERROR/; 
/Name="([^"]+)"\s+Age="([^"]+)"/; 
print $1, " ", $2, "\n"; 
} 

可以读取stdin;当然,您可以将阅读循环更改为其他任何内容,并使用某些内容来填充散列或根据您的需要进行打印。

+1

非常感谢bro ..在生活中不会忘记你..谢谢.. – Raj 2010-07-01 09:09:32

+1

在什么意义下使用perl像sed?这是使用perl像_perl_。我更喜欢下面的不同答案中的调用。 – 2016-10-23 14:54:04

+0

你更喜欢,而且我应该在乎...... OP不同意你的看法,并且这会关闭这个问题并将你的评论标记为无关紧要。此外,也许你和你之前的其他人一样,未能把握标题中OP所使用的“sed”这个表达方式的宽泛性,弱化性,松散性而非字面意义。不是我的错。每个答案总是可以做得更好,当然,但是OP很快就可以完成,因此对我来说结束了。其他需求可以通过更好的(以你的愚见)答案来满足。 (顺便说一句,我经常使用sed'-f',因为复杂的编辑可能很难完成,因为oneliner-是我使用sed像perl ??) – ShinTakezou 2016-11-05 13:53:17

-2

参考意见:

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 
+1

我建议不要将所有内容读入一个数组然后处理它。请逐行阅读。 – 2010-07-01 14:20:10

+0

马修,不要把它给你,但我可以问为什么吗? – 2010-07-01 15:00:12

+0

如果您的文件大于RAM,则系统将挂起。这就是为什么。但更重要的是,您不需要将整个文件存储在数组中 - 将当前行存储在* single *变量中就足够了。不是吗? :)或者最好,只需使用$ _。 – 2010-07-01 15:45:32

17

作为一个班轮:

perl -lne '/^--ERROR---.*Name="(.*?)" Age="(.*?)"/ && print "$1 $2"' file 
+0

什么异常类似的答案!我永远不会记得'-l',++。 – daotoad 2010-07-01 09:04:54

+0

谢谢!这真是sed的直接替代品。 – akostadinov 2012-11-15 15:59:37

5

作为一个衬垫,尝试:

perl -ne 'print "$1 $2\n" if /^--ERROR/ && /Name="(.*?)"\s+Age="(.*?)"/;' 

这是很多喜欢使用SED,但是使用Perl语法。

2

“如何使用perl像sed?”的直接问题最好用s2p来回答,sed to perl转换器。给定命令行“sed $ script”,只需调用“s2p $ script”来生成一个(通常不可读的)perl脚本,该脚本模拟给定的一组命令的sed。

+0

s2p不再带有Perl,但你可以在模块[App :: s2p](https://www.metacpan.org/module/App::s2p) – 2018-02-07 22:23:32

8

的perl -p -e的/../../ G'文件

或内联取代:

的perl -pi -e的/../../ G'文件