Comment puis-je créer un fichier de commandes agissant comme un simple grep utilisant Perl?

StackOverflow https://stackoverflow.com/questions/106053

  •  01-07-2019
  •  | 
  •  

Question

Je connais déjà la réponse évidente à cette question: & "Il suffit de télécharger < insérez vos fenêtres préférées grep ou un outil similaire à grep ici > &" ;. Cependant, je travaille dans un environnement avec des contrôles stricts de la part du personnel informatique local pour ce qui est autorisé à avoir sur nos ordinateurs. Qu'il suffise de dire: j'ai accès à Perl sous Windows XP. Voici un petit script Perl que je trouve qui fait ce que je veux, mais je n’ai pas compris comment configurer un fichier de commandes de sorte que je puisse y diriger une sortie de commande, ou passer un fichier (ou une liste de fichiers). ?) en tant qu'argument après l'expression " to grep ":

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

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

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

MODIFIER : Même si j'ai marqué un autre & "répondre &", je voulais féliciter Réponse de Ray Hayes , car c'est vraiment le &" ; Windows Way & Quot; pour le faire, même si une autre réponse est techniquement plus proche de ce que je voulais.

Était-ce utile?

La solution

J'ai écrit ceci 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 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

Autres conseils

La majeure partie de la puissance de grep est déjà disponible sur votre ordinateur dans l'application Windows FindStr.exe, qui fait partie de tous les ordinateurs Windows 2000, XP et Vista! Il offre RegExpr etc.

Beaucoup plus simple qu'un fichier de commandes qui appelle à son tour 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

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

Tout d'abord, transformez-le en un vrai script au lieu d'un one-liner:

use strict;
use warnings;

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

Puis transformez-le en fichier batch à l'aide de pl2bat:

pl2bat mygrep.pl

Ceci créera & "mygrep.bat &";

.

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

Bien que les outils électriques Perl fonctionnent bien si vous ne pouvez utiliser que Perl, je préfère généralement l'ensemble de GnuWin32 des outils. Ils ne nécessitent pas d'installation. (Vous n'avez pas besoin de privilèges d'administrateur, mais simplement d'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 ceci dans votre fichier de commandes pour exécuter votre script personnalisé avec 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 monfichier.txt &", & "grep mypattern. &"; & "grep mypattern * .doc & ";", etc.

Vous devez faire quelque chose comme ceci:

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

Le "%% 1 " passera l'argument au script Perl. Enregistrez-le en tant que fichier .bat et vous pourrez continuer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top