【问题标题】:How can I print the names of the files being processed in a Perl one-liner?如何打印在 Perl 单行中处理的文件的名称?
【发布时间】:2009-08-13 11:18:42
【问题描述】:

我通常使用 perl one liner 而不是 grep 来搜索文件。

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

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

但我找不到打印包含这些行的文件名的方法。我尝试打印$ARGV[0],但无济于事。

那么,如何打印包含这些行的文件名?

【问题讨论】:

  • 使用 grep。然后你的问题就会消失(grep -l)
  • @depesz 它只会消失,直到你需要做一些更复杂的事情。
  • 撤回我的答案:$_ 被 shell 解释,而不是 perl,尽管有引号等。尝试 echo $_:var 包含最后一个命令的第二部分,这就是我回答的原因似乎正在按要求打印文件名。
  • depesz,我的 Windows 机器上没有 grep。但我确实有 perl;

标签: perl command-line


【解决方案1】:

包含*ARGV 打开的文件名称的变量是$ARGV,而不是$ARGV[0](这是@ARGV 的第一个元素)。

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

【讨论】:

    【解决方案2】:

    $ARGV 是当前正在读取的文件名的特殊变量。我相信这就是您所需要的。

    【讨论】:

      【解决方案3】:

      使用ack,这是 grep 的一个很好的替代品(用 perl 编写):

      $ ack --cc '#include'
      

      注意

      我知道,我在作弊:-P

      【讨论】:

      • 确实,ack 是一个很好的 grep 替代品。
      • 不是作弊,但 sed 是替换 grep 的合适工具。
      • @William:嗯? sed 编辑,grep 匹配。 sed 如何是替换 grep 的合适工具?
      猜你喜欢
      • 1970-01-01
      • 2016-06-05
      • 2011-04-26
      • 2021-09-06
      • 1970-01-01
      • 2013-05-18
      • 2014-06-22
      • 2017-04-22
      • 1970-01-01
      相关资源
      最近更新 更多