为什么" print / regex /?打印a:打印b"把" 1"在每一行之前?

时间:2015-07-06 13:28:51

标签: perl

当我运行下面的Perl单行时,它会在每行前面打印1,这是我不想要的。它应该做的只是与root匹配的评论行。

$ cat /etc/passwd | perl -ne 'print /root/ ? print "\#$_" : print $_'
1daemon:x:1:1::/:
1bin:x:2:2::/usr/bin:
#root:x:0:0:Super-User:/root:/usr/bin/bash
1sys:x:3:3::/:

4 个答案:

答案 0 :(得分:10)

您正在打印print的返回值,该值已成功,因此评估为1

我建议您将代码更改为:

perl -pe '$_ = "#$_" if /root/' /etc/passwd

我在这里使用-p开关,以便始终打印$_。在#匹配时,在行开头之前添加了/root/

如果您想明确执行print,请使用:

perl -ne 'print /root/ ? "#$_" : $_' /etc/passwd

答案 1 :(得分:8)

你只需要一个print;不要在三元内放两个以上!

perl -ne 'print /root/ ? "\#$_" : $_' </etc/passwd

实际上,您无条件地打印三元运算符执行的print的返回值 - 因此,1

答案 2 :(得分:3)

您在每一行都获得了1,因为它是对/root/ ? case_true : case_false进行评估的结果。

要解决此问题,请在print之前删除最初的/root/

cat /etc/passwd | perl -ne '/root/ ? print "\#$_" : print $_'
#                           ^
#                   no print!

另请注意,不需要cat file | perl。相反,请说perl file

perl -ne '/root/ ? print "\#$_" : print $_' /etc/passwd

答案 3 :(得分:2)

如何

perl -pe 'print "#" if /root/' /etc/password

由于-p,无论如何都打印每一行,但如果正则表达式匹配则首先打印一个哈希字符