我通常使用perl而不是grep來搜索文件。如何在Perl單行內打印正在處理的文件的名稱?
例如以下打印所有含#include <stdio.h>
perl -ne "print if(/#include\s*[\"<]stdio.h/)" */*.[ch]
位置,但我無法找到一個方法來打印了這些線路的文件名。我試圖打印$ARGV[0]
但無濟於事。
那麼,如何打印包含這些行的文件名?
我通常使用perl而不是grep來搜索文件。如何在Perl單行內打印正在處理的文件的名稱?
例如以下打印所有含#include <stdio.h>
perl -ne "print if(/#include\s*[\"<]stdio.h/)" */*.[ch]
位置,但我無法找到一個方法來打印了這些線路的文件名。我試圖打印$ARGV[0]
但無濟於事。
那麼,如何打印包含這些行的文件名?
$ARGV
是當前正在讀取的文件的名稱的特殊變量。我相信這是你需要的。
的確,ack是一個很好的grep替代品。 – Pinochle 2009-08-13 11:24:22
沒有作弊,但sed是取代grep的正確工具。 – 2009-08-13 11:27:09
@William:嗯? 'sed'編輯,'grep'匹配。 'sed'是如何取代'grep'的合適工具? – Telemachus 2009-08-13 11:45:35
包含變量*ARGV
打開的文件的名稱是$ARGV
,而不是$ARGV[0]
(這是@ARGV
的第一個元素)。
print "$ARGV: $_" if /include\s*[\"<]stdio.h/;
使用grep。然後你的問題將消失(grep -l) – 2009-08-13 11:37:21
@depesz它只會消失,直到你需要做更復雜的事情。 – 2009-08-13 14:18:25
退回我的答案:$ _正在被shell解釋,而不是perl,儘管引號等。試試echo $ _:var包含最後一個命令的第二部分,這就是爲什麼我的答案似乎是將文件名打印爲需要。 – 2009-08-13 14:47:27