Frage

Ich weiß schon, die offensichtliche Antwort auf diese Frage: „einfach herunterladen “. Allerdings arbeite ich in einer Umgebung mit strengen Kontrollen durch die lokalen IT-Mitarbeiter, was wir erlaubt sind auf unseren Computern zu haben. Es genügt zu sagen: Ich habe Zugang zu Perl auf Windows XP. Hier ist ein schneller Perl-Skript ich damit kam nicht, was ich will, aber ich habe nicht gedacht, nach oben wie eine Batch-Datei so einzurichten, dass ich kann entweder Rohr eine Befehlsausgabe hinein, oder eine Datei übergeben (oder eine Liste von Dateien ?) als Argument nach dem "Ausdruck grep":

perl -n -e "print $_ if (m![expression]!);" [filename]

Wie schreibe ich einen Batch-Skript, das ich so etwas wie, zum Beispiel tun können:

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

Bearbeiten : Obwohl ich eine andere "Antwort" markiert, wollte ich ein dickes Lob geben, Ray Hayes beantworten , wie es wirklich das ist "Windows Way", es zu tun, auch wenn eine andere Antwort ist technisch näher an, was ich wollte.

War es hilfreich?

Lösung

Ich schrieb dieses eine Weile zurück:

@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

Andere Tipps

Die meisten der Leistung von grep ist bereits auf Ihrem Gerät in der Windows-Anwendung Findstr.exe, die Bestandteil aller Windows 2000, XP und Vista-Maschinen ist! Es bietet RegExpr etc.

Weit einfacher als eine Batch-Datei, die wiederum ruft 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" x.y' searches for "hello" or
"there" in file x.y.  'FINDSTR /C:"hello there" x.y' searches for
"hello there" in file x.y.

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
  [x-y]    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

Herunterladen und Installieren von ack . Es ist ein überlegener Ersatz grep und - dank der Perl-Magie Dual-Mode-.BAT / Perl-Skript Magie -. Es für Sie auf der Kommandozeile arbeiten wird

Zuerst macht es zu einem echten Skript anstelle einem Einzeiler:

use strict;
use warnings;

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

Dann schalten Sie ihn in eine Batch-Datei mit pl2bat:

pl2bat mygrep.pl

Das erzeugt "mygrep.bat".

Für eine voll funktionsfähige grep (und vielen anderen Unix-Anwendungen) geschrieben vollständig in Perl finden Sie in der Perl Power tools Projekt.

Während die Perl Power Tools sind gut, wenn Sie Perl laufen kann, ziehe ich den Satz von GnuWin32 Werkzeuge. Sie benötigen keine Installation. (Sie keine Administratorrechte benötigen, nur ein Verzeichnis, das Sie schreiben können.)

Ich bin mit Axeman und Mr. Hayes über ein besseres Werkzeug für den Job. Das heißt, Sie so etwas wie dies in Batch-Datei könnte versuchen, Ihre benutzerdefinierten Skript für eine Datei Wildcard Ausdruck auszuführen:

@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"
)

Auf diese Weise können Sie Dinge wie "grep myPattern myfile.txt", "grep myPattern.", "Grep myPattern * .doc", etc.

Sie brauchen so etwas wie dies zu tun:

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

Das "% 1" wird das Argument für das Perl-Skript übergeben. Speichern Sie es als eine .bat-Datei, und Sie sind gut zu gehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top