2009-08-13 53 views
2

我通常使用perl而不是grep來搜索文件。如何在Perl單行內打印正在處理的文件的名稱?

例如以下打印所有含#include <stdio.h>

perl -ne "print if(/#include\s*[\"<]stdio.h/)" */*.[ch] 

位置,但我無法找到一個方法來打印了這些線路的文件名。我試圖打印$ARGV[0]但無濟於事。

那麼,如何打印包含這些行的文件名?

+1

使用grep。然後你的問題將消失(grep -l) – 2009-08-13 11:37:21

+0

@depesz它只會消失,直到你需要做更復雜的事情。 – 2009-08-13 14:18:25

+1

退回我的答案:$ _正在被shell解釋,而不是perl,儘管引號等。試試echo $ _:var包含最後一個命令的第二部分,這就是爲什麼我的答案似乎是將文件名打印爲需要。 – 2009-08-13 14:47:27

回答

4

$ARGV是當前正在讀取的文件的名稱的特殊變量。我相信這是你需要的。

4

使用ack,這是一個很好的替代(用Perl編寫)grep的:

​​

NB

我知道,我一直在騙:-P

+3

的確,ack是一個很好的grep替代品。 – Pinochle 2009-08-13 11:24:22

+0

沒有作弊,但sed是取代grep的正確工具。 – 2009-08-13 11:27:09

+2

@William:嗯? 'sed'編輯,'grep'匹配。 'sed'是如何取代'grep'的合適工具? – Telemachus 2009-08-13 11:45:35

10

包含變量*ARGV打開的文件的名稱是$ARGV,而不是$ARGV[0](這是@ARGV的第一個元素)。

print "$ARGV: $_" if /include\s*[\"<]stdio.h/; 
相關問題