¿Cómo puedo hacer que un archivo de proceso por lotes para actuar como un simple grep usando Perl?

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

  •  01-07-2019
  •  | 
  •  

Pregunta

Yo ya sé la respuesta obvia a esta pregunta:"sólo tiene que descargar <insert favorite="" windows="" grep="" or="" grep-like="" tool="" here="">".Sin embargo, yo trabajo en un entorno con estrictos controles por parte de los empleados de TI como lo que nos permite tener en nuestros ordenadores.Baste decir:Tengo acceso a Perl en Windows XP.He aquí una rápida secuencia de comandos Perl se me ocurrió que hace lo que quiero, pero no he descubierto cómo configurar un archivo de proceso por lotes dicho que me puede tubería de salida de un comando en él, o pasar un archivo (o una lista de archivos?) como argumento después de la "expresión grep":

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

¿Cómo puedo escribir una secuencia de comandos por lotes que puedo hacer algo, como, por ejemplo:

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

EDITAR:Aunque me marcó otro "respuesta", quise dar kudos a Ray Hayes respuesta, como es realmente el "Windows" para hacerlo, incluso si la otra respuesta es técnicamente más cerca de lo que yo quería.

¿Fue útil?

Solución

Esto lo escribí hace un tiempo:

@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

Otros consejos

La mayoría de la energía de grep ya está disponible en su máquina en la aplicación de Windows FindStr.exe que es parte de todos los Windows 2000, XP y Vista máquinas!Ofrece RegExpr etc.

Mucho más fácil que un archivo por lotes que a su vez llama 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

Descargar e instalar ack.Es un superior de reemplazo a grep y - gracias a Perl de la magia de modo dual .BAT / script Perl de la magia - que va a trabajar en la línea de comandos para usted.

Primero, que la convierten en una verdadera secuencia de comandos en lugar de una sola línea:

use strict;
use warnings;

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

Luego convertirlo en un archivo por lotes mediante pl2bat:

pl2bat mygrep.pl

Esto creará "mygrep.bat".

Para una completa grep (y muchas otras aplicaciones Unix), escrito completamente en Perl, ver la Perl De Las Herramientas De Poder proyecto.

Mientras que el Perl de las Herramientas eléctricas son buenas si sólo se puede ejecutar Perl, por lo general, prefiero el conjunto de GnuWin32 herramientas.No requiere de instalación.(Usted no necesita privilegios administrativos, sólo un directorio que usted pueda escribir.)

Estoy de acuerdo con Axeman y el SeñorHayes sobre el uso de una mejor herramienta para el trabajo.Dicho esto, usted podría intentar algo como esto en tu archivo de proceso por lotes para que se ejecute el script personalizado en contra de un archivo expresión comodín:

@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 esta manera, usted puede hacer cosas como "grep mypattern myfile.txt", "grep mypattern .", "grep mypattern *.doc", etc.

Usted necesita para hacer algo como esto:

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

El "%1" se pasa el argumento al script en Perl.Guardar como .archivo bat, y ya está bueno para ir.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top