我怎样才能使batch file像使用Perl一样简单的grep?

我已经知道了这个问题的明显答案:“只需下载<在此插入喜欢的windows grep或grep-like工具>”。 但是,我在一个由本地IT人员严格控制的环境中工作,就是允许我们的电脑上有什么东西。 只需说:我可以在Windows XP上使用Perl。 这里有一个我想出来的快速Perl脚本,但是我还没有想到如何设置一个batch file,这样我就可以将一个命令输出传递给它,或者传递一个文件(或文件列表?)作为“expression式到grep”之后的参数:

 perl -n -e“print $ _ if(m![expression]!);”  [文件名]

如何编写一个批处理脚本,我可以这样做,例如:

 dir |  grep.bat mypattern
 grep.bat mypattern myfile.txt

编辑 :即使我标记了另一个“答案”,我想给雷伊·海耶斯的答案 ,因为它是真正的“Windows方式”做到这一点,即使另一个答案在技术上更接近我想要的。

Solutions Collecting From Web of "我怎样才能使batch file像使用Perl一样简单的grep?"

我后来写了这个:

@rem = '--*-Perl-*-- @echo off perl -x -S %0 %* goto endofperl @rem -- BEGIN PERL -- '; #!d:/Perl/bin/perl.exe -w #line 10 use strict; #use Test::Setup; use Getopt::Long; Getopt::Long::Configure ("bundling"); my $ignore_case = 0; my $number_line = 0; my $invert_results = 0; my $verbose = 0; my $result = GetOptions( 'i|ignore_case' => \$ignore_case, 'n|number' => \$number_line, 'v|invert' => \$invert_results, 'verbose' => \$verbose, ); my $regex = shift; if ( $ignore_case ) { $regex = "(?i:$regex)"; } $regex = qr/$regex/; print "\$regex=$regex\n"; if ( $verbose ) { print "Verbose: Ignoring case.\n" if $ignore_case; print "Verbose: Printing file name and line number.\n" if $number_line; print "Verbose: Inverting result set.\n" if $invert_results; print "\n"; } @ARGV = map { glob "$_" } @ARGV; while ( <> ) { my $matches = m/$regex/; next unless $matches ^ $invert_results; print "$ARGV\:$.:" if $number_line; print; } __END__ :endofperl 

grep的大部分功能已经在你的机器上的Windows应用程序FindStr.exe中提供,它是所有Windows 2000,XP和Vista机器的一部分! 它提供RegExpr等。

远比批处理文件更容易调用Perl!

 c:\>FindStr /? Searches for strings in files. FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file] [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]] strings [[drive:][path]filename[ ...]] /B Matches pattern if at the beginning of a line. /E Matches pattern if at the end of a line. /L Uses search strings literally. /R Uses search strings as regular expressions. /S Searches for matching files in the current directory and all subdirectories. /I Specifies that the search is not to be case-sensitive. /X Prints lines that match exactly. /V Prints only lines that do not contain a match. /N Prints the line number before each line that matches. /M Prints only the filename if a file contains a match. /O Prints character offset before each matching line. /P Skip files with non-printable characters. /OFF[LINE] Do not skip files with offline attribute set. /A:attr Specifies color attribute with two hex digits. See "color /?" /F:file Reads file list from the specified file(/ stands for console). /C:string Uses specified string as a literal search string. /G:file Gets search strings from the specified file(/ stands for console). /D:dir Search a semicolon delimited list of directories strings Text to be searched for. [drive:][path]filename Specifies a file or files to search. Use spaces to separate multiple search strings unless the argument is prefixed with /C. For example, 'FINDSTR "hello there" xy' searches for "hello" or "there" in file xy 'FINDSTR /C:"hello there" xy' searches for "hello there" in file xy Regular expression quick reference: . Wildcard: any character * Repeat: zero or more occurances of previous character or class ^ Line position: beginning of line $ Line position: end of line [class] Character class: any one character in set [^class] Inverse class: any one character not in set [xy] Range: any characters within the specified range \x Escape: literal use of metacharacter x \<xyz Word position: beginning of word xyz\> Word position: end of word 

下载并安装ack 。 这是对grep的一个优越的替代,并且 – 感谢Perl的神奇的双重模式.BAT / Perl脚本魔法 – 它可以在你的命令行上工作。

首先,把它变成一个真正的脚本,而不是一个单行的:

 use strict; use warnings; my $pattern = shift or die "Usage: $0 <pattern> [files|-]\n"; while (<>) { print if /$pattern/ } 

然后使用pl2bat将其转换为批处理文件:

 pl2bat mygrep.pl 

这将创建“mygrep.bat”。

对于完全用Perl编写的全功能grep(以及许多其他Unix应用程序),请参阅Perl Power Tools项目。

虽然Perl Power Tools如果只能运行Perl,但是我通常更喜欢一套GnuWin32工具。 他们不需要安装。 (你不需要管理权限,只需要一个可以写入的目录。)

我同意Axeman和Hayes先生关于使用更好的工具的工作。 也就是说,你可以在你的批处理文件中尝试这样的操作来针对文件通配符表达式运行你的自定义脚本:

 @echo off for /f "usebackq delims==" %%f in (`dir /w /b %2`) do ( perl -n -e "print $_ if (m!%1!);" "%%f" REM or something like: myperlscript.pl %1 "%%f" ) 

这样就可以做“grep mypattern myfile.txt”,“grep mypattern”,“grep mypattern * .doc”等等。

你需要做这样的事情:

 @echo off perl -x -S script.pl %1 

“%1”将参数传递给Perl脚本。 将它保存为一个.bat文件,你很好走。