Ottenere questa semplice espressione regolare per adattarsi a grep

Voglio corrispondere a un preventsvo, 2 , uno spazio e qualsiasi carattere che non è un punto letterale.

Questo sta utilizzando GnuWin32 grep. Non è il grep di Cygwin .

 C:\>echo "2 008abc.html" | grep -oiP \"2 [^.] grep: [^.]': No such file or directory C:\>echo "2 008abc.html" | grep -oiP ^"2 [^.] C:\>echo "2 008abc.html" | grep -oiP """2 [^.] grep: [^.]: No such file or directory C:\>echo "2 008abc.html" | grep -oiP """2 0 grep: 0: No such file or directory C:\>echo "2 008abc.html" | grep -oiP """"2 0" "2 0 C:\>echo "2 008abc.html" | grep -oiP """"2 [^.]" C:\>echo "2 008abc.html" | grep -oiP """"2 0" "2 0 

(Ho risposto alla mia precedente domanda nella sua precedente revisione, non ho bisogno di riferirmi, ma port ad un altro problema di corrispondenza fortemente correlato, quindi ho rivisto questa domanda a qualcosa di molto simile, ma in un problema.)

Sembra che utilizzi il prompt dei comandi di Windows ( cmd.exe ) come shell e stai ingannando dalle sue convenzioni di citazione o dalla mancanza. Se eseguo il tuo command in Fedora 15 Bash shell, funziona. Se l'ho eseguito in Windows utilizzando il shell Bash di Cygwin, funziona.

Per farlo funzionare con cmd.exe , devi modificare le virgolette e la spaziatura. Ho eseguito i comandi di seguito in cmd.exe su Windows 7. Nota come ho cambiato le virgolette sul command grep per utilizzare singole virgolette invece di doppie virgolette e non c'è spazio prima del pipe ( | ).

Sto utilizzando la versione Cygwin di GNU grep, che dovrebbe comportrsi come il tuo grep di Win32 GNU.

 c:\>c:\cygwin\bin\grep --v GNU grep 2.6.3 Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. c:\>echo "2008abc.html"| c:\cygwin\bin\grep -oiP '\"[^.]' "2 

Se c'è uno spazio prima del pipe, lo spazio verrà echeggiato attraverso la pipeline e il grep corrisponderà. Ciò è dovuto al comportmento idiotico di parsing di cmd.exe .

 c:\>echo "2008abc.html" | c:\cygwin\bin\grep -oiP '\"[^.]' "2 " 

Per la tua propria sanità, vedere se è ansible utilizzare Bash di Cygwin o qualsiasi altra shell con convenzioni di citazione ragionevoli e coerenti.

Questa è una soluzione.

 C:\>echo "2 008abc.html" | grep -oiP \"2" "[^.] "2 0 

Questa sperimentazione ha aiutato (w è w.exe, che è compilato wc)

 C:\>w \"2\ [^.] argv[0] = w argv[1] = "2\ argv[2] = [^.] C:\>w \"2" "[^.] argv[0] = w argv[1] = "2 [^.] C:\> 

Ecco un'altra soluzione

 C:\>echo "2 008abc.html" | grep -oiP "\"2 [^^.]" "2 0 

che come si può vedere ho trovato dopo un po 'fiddling, anche se trovato abbastanza rapidamente

 W:\other>w "\"2 [^.]" argv[0] = w argv[1] = "2 [.] W:\other>w "\"2 [\^.]" argv[0] = w argv[1] = "2 [\.] W:\other>w "\"2 [^.]" argv[0] = w argv[1] = "2 [.] W:\other>w "\"2 [^^.]" argv[0] = w argv[1] = "2 [^.] 

bagno

 #include <stdio.h> int main(int argc, char *argv[]) { int i = 0; while (argv[i]) { printf("argv[%d] = %s\n", i, argv[i]); i++; } return 0; } 

questo è utile prima di wc È ansible utilizzarlo per vedere esattamente cosa bash rimuove. xc

 #include <stdio.h> #include <windows.h> int main(int argc, char *argv[]) { printf(GetCommandLine()); return 0; } 

ex-

 C:\>x & x C:\> C:\>x ^& x & C:\>