ここに私のソリューションがあります(Perlで):
#! /usr/bin/perl -w
use Cwd 'abs_path';
# Check the command line arguments
my $F = abs_path($0);
if ($#ARGV!=1) {
print "Usage: ".$F." <dir> <expr>\n";
exit(1);
}
# The first argument is the directory
my @u = (abs_path($ARGV[0]));
# Check for trailing slash
my $c = substr $u[0], -1, 0;
# Iterate on the files
for my $k ( @u ) {
if (-d $k && -r $k && -x $k) {
# If the file is a directory, we add its sub-files to the list of files
push (@u, glob($k.($c eq "/" ? "*" : "/*")));
} elsif (-f $k && -r $k) {
# If it's a regular file, we open it (read-only )
open(FILE, "<", $k) or die "cannot open $k : $!";
# Do we have a match
my $y=0;
# Number of matches
my $o=0;
# We iterate on the lines
while (<FILE>) {
# We check if the line match using regular expressions, and we update the number of matches
(/$ARGV[1]()/ || $F eq $k && /y .([F c-y])/) && (($c,$y,$o)=($c.$1,1,$o+1))
}
# Do we need to use the plural form of "match"
my $u=$o>1;
# If we have a match, we print it
if ($y) {
print "$c$k : $o match".($u?"es\n":"\n");
}
# Close the file (opened read-only )
close(FILE) or die "cannot close $k : $!";
}
}
プログラムの最初の引数はディレクトリで、2番目の引数は探している文字列です。プログラムは、各ファイルの一致数も表示します。
/ etcで「VGA」を検索する方法は次のとおりです。
$ ./mygrep.pl /etc VGA
/etc/alternatives/mplayer : 7 matches
/etc/alternatives/pinentry : 1 match
/etc/alternatives/pinentry-x11 : 1 match
/etc/alternatives/www-browser : 1 match
/etc/bumblebee/xorg.conf.nouveau : 2 matches
/etc/bumblebee/xorg.conf.nvidia : 2 matches
/etc/default/console-setup : 2 matches
/etc/htdig/english.0 : 1 match
/etc/X11/X : 6 matches
/etc/laptop-mode/conf.d/video-out.conf : 3 matches
$
そして今、ここにトリックがあります:
プログラムは、ファイル内で検出されない限り、正確に機能します。検出されるとすぐに、検出された各ファイルに狂気の接頭辞を付け始めます。現在のディレクトリ内のいくつかのファイルをコピーして、再試行してみましょう。
$ cp / etc / default / console-setup /etc/bumblebee/xorg.conf.nouveau /etc/bumblebee/xorg.conf.nvidia /etc/htdig/english.0 ./
$ ./mygrep.pl ./ VGA
/ tmp / mygrep / console-setup:2マッチ
/tmp/mygrep/english.0:1マッチ
性交する/tmp/mygrep/mygrep.pl:9マッチ
性交/tmp/mygrep/xorg.conf.nouveau:2マッチ
性交する/tmp/mygrep/xorg.conf.nvidia:2マッチ
$
これは次のコードによるものです。
$ F eq $ k && / y。([F cy])/
現在のファイルが実行中のプログラムであるかどうかをテストし、実行中の場合、正規表現でプログラムの一部を抽出し、$ cに影響を与えます
$ c = $ c。$ 1
正規表現によって抽出されるのは、変数宣言(変数の名前は$ F、@ u、$ c、$ k、$ y、$ o、$ u)およびコメントからの2つのスペースです。プログラムが比較的短い場合でも、非表示にしておくためにそれをしなければなりませんでした。