当我运行下面的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::/:
答案 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
,无论如何都打印每一行,但如果正则表达式匹配则首先打印一个哈希字符