Comment puis-je créer un fichier batch pour agir comme un simple grep en utilisant Perl?

Je connais déjà la réponse évidente à cette question: “il suffit de télécharger “. Cependant, je travaille dans un environnement où le personnel informatique local contrôle ssortingctement ce que nous sums autorisés à utiliser sur nos ordinateurs. Autant dire: j’ai access à Perl sous Windows XP. Voici un rapide script Perl que j’ai créé et que je veux, mais je n’ai pas compris comment configurer un fichier de commandes de manière à pouvoir y insérer une sortie de commande ou transmettre un fichier (ou une liste de fichiers). ?) comme argument après l’expression à grep:

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

Comment puis-je écrire un script batch que je peux faire, par exemple:

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

EDIT : Même si j’ai marqué une autre “réponse”, je voulais donner une réponse à Ray Hayes , car c’est vraiment la “manière Windows” de le faire, même si une autre réponse est techniquement plus proche de ce que je voulais.

Je l’ai écrit il y a quelque temps:

@rem = '--*-Perl-*-- @echo off perl -x -S %0 %* goto endofperl @rem -- BEGIN PERL -- '; #!d:/Perl/bin/perl.exe -w #line 10 use ssortingct; #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 

La plus grande partie de la puissance de grep est déjà disponible sur votre ordinateur dans l’application Windows FindStr.exe qui fait partie de toutes les machines Windows 2000, XP et Vista! Il offre RegExpr etc.

Bien plus facile qu’un fichier batch qui à son tour appelle Perl!

 c:\>FindStr /? Searches for ssortingngs in files. FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file] [/C:ssortingng] [/G:file] [/D:dir list] [/A:color atsortingbutes] [/OFF[LINE]] ssortingngs [[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 ssortingngs literally. /R Uses search ssortingngs 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 atsortingbute set. /A:attr Specifies color atsortingbute with two hex digits. See "color /?" /F:file Reads file list from the specified file(/ stands for console). /C:ssortingng Uses specified ssortingng as a literal search ssortingng. /G:file Gets search ssortingngs from the specified file(/ stands for console). /D:dir Search a semicolon delimited list of directories ssortingngs Text to be searched for. [drive:][path]filename Specifies a file or files to search. Use spaces to separate multiple search ssortingngs 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 \ Word position: end of word 

Téléchargez et installez ack . C’est un remplacement supérieur à grep et – grâce à la magie du script double mode .BAT / Perl de Perl – cela fonctionnera sur la ligne de commande pour vous.

Tout d’abord, transformez-le en un véritable script au lieu d’un one-liner:

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

Ensuite, transformez-le en un fichier de commandes à l’aide de pl2bat:

 pl2bat mygrep.pl 

Cela va créer “mygrep.bat”.

Pour un grep complet (et de nombreuses autres applications Unix) entièrement écrit en Perl, consultez le projet Perl Power Tools .

Bien que les outils Perl Power soient bons si vous ne pouvez exécuter que Perl, je préfère généralement l’ensemble des outils GnuWin32 . Ils ne nécessitent pas d’installation. (Vous n’avez pas besoin de privilèges d’administration, juste un répertoire dans lequel vous pouvez écrire.)

Je suis d’accord avec Axeman et M. Hayes sur l’utilisation d’un meilleur outil pour le travail. Cela dit, vous pouvez essayer quelque chose comme ça dans votre fichier de commandes pour exécuter votre script personnalisé sur une expression générique de fichier:

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

De cette façon, vous pouvez faire des choses comme “grep mypattern myfile.txt”, “grep mypattern.”, “Grep mypattern * .doc”, etc.

Vous devez faire quelque chose comme ceci:

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

Le “% 1” transmettra l’argument au script Perl. Enregistrez-le sous forme de fichier .bat et vous êtes prêt à partir.