获取使用perl regexp时在linux控制台中执行的脚本的名称

获取使用perl regexp时在linux控制台中执行的脚本的名称,linux,perl,console,Linux,Perl,Console,我想使用perl regexp对文件中的文本进行grep,我就是这么做的 find ./ -name *.php -print | xargs perl -nle '/standard/ and print $0' 正如我(使用谷歌)在$0中发现的,必须是已执行脚本的名称,但它包含“-e”。 如何获取执行的scriptname?是否列出所有包含字符串standard的php文件?如果是这样,我将使用grep-r: grep -r -l 'standard' . | grep '\.php$'

我想使用perl regexp对文件中的文本进行grep,我就是这么做的

find ./ -name *.php -print | xargs perl -nle '/standard/ and print $0'
正如我(使用谷歌)在$0中发现的,必须是已执行脚本的名称,但它包含“-e”。
如何获取执行的scriptname?

是否列出所有包含字符串
standard
的php文件?如果是这样,我将使用
grep-r

grep -r -l 'standard' . | grep '\.php$'

正如我在对您的问题的评论中所述,没有脚本名称,因为您没有执行脚本文件。假设要打印传递给xargs/perl的文件名,请使用
$ARGV[0]
获取perl调用的第一个位置参数(xargs会自动将其附加到命令行)

您还应该使用
find-print0 | xargs-0
正确处理带有换行符的文件


扩展grep代码段:在使用find:

find . -name '*.php' -print0 | \
  xargs -0 -L1 sh -c 'grep -l "pattern" "$1"' -
xarsg-L1
一次只向新shell传递一个文件名
grep-l“$1”
打印文件名并在第一次匹配后停止grepping
-
作为sh的第一个参数是必需的,这样
$1
就可以工作


另一个编辑

我在想办法解决这个问题。最后一个命令可以很容易地简化为:

find . -name '*.php' -print0 | xargs -0 grep -l "pattern"

当然,这并不像sh-c版本那样容易扩展,它几乎可以做任何事情。

我假设您想要的是打印文件名。如果是,请使用
$ARGV

perl -nle '/standard/ and print $ARGV'
perldoc-v'$ARGV'

$ARGV   contains the name of the current file when reading from <>.

程序员将长的find/grep命令行替换为。它使用Perl正则表达式,它比GNU grep更高级,具有
-P
(PCRE)或regex POSIX grep使用的任何gimped实现

ack --php -l '(?<!\$)standard'

ack--php-l'(?您没有执行任何脚本,而是直接将字符串传递给perl,然后再执行。它没有名称,因为它没有存储到文件存储库,您是对的。我需要在这个perl脚本中通过xargs传递scriptname。所以这是一个简单的示例:-)表达式可以如下所示”(?正如knittl所说,我会使用-e扩展名(或egrep)来获得扩展的正则表达式库(仍然不是完全兼容perl的正则表达式,但egrep要快得多。是的,我同意你的观点,但是扩展正则表达式是POSIX正则表达式,不是perl,不支持上面提到的表达式。我尝试了这个发现。/-name*.php-print0 | xargs-0 perl-nle'/standard/和print$1',没有任何效果(抱歉,应该是
$ARGV[0]
$1
是shell…很好的回答,我正在删除我的,因为这一个更重要complete@knittl我认为使用
grep
是个好主意。我只是回答了问题的“perl”部分。事实上,你不能只使用
grep-l”标准吗"
而不是perl one liner?grep需要
-r
递归到子目录中,再使用另一个grep来过滤结果列表。使用
find
进行过滤可能是一个好主意,这样就不必对大量文件执行grep操作。我已经修改了我的答案,并对其进行了编辑,使其仅包含一个工作find+xargs+sh+grep-solution@knittl 为什么
grep-q
而不是
grep-l
ack --php -l '(?<!\$)standard'