findstr di comando di Windows espressione regolare

C’è un modo per cercare 2 o più posti in fila tra le lettere, utilizzando findstr da riga di comando di Windows?

Esempio:

Hello world!  - nomatch wanted
Hello  world! - match wanted

Qual è la sintassi delle espressioni regolari?

Inoltre, potete per favore aiutarmi a capire la seguente riga di comando sessione (differenza tra [ ] e [ ]*; il secondo comando non restituisce nulla):

c:\1>findstr -i -r  "view[ ]*data.sub" "view data sub.acf"
View Data Sub.ACF:            "].DATE_STAMP)>=[Forms]![MainNav]![View Data Sub]"
View Data Sub.ACF:            "].DATE_STAMP)<[Forms]![MainNav]![View Data Sub]"

c:\1>findstr -i -r  "view[ ]data.sub" "view data sub.acf"

c:\1>

PS: Solo per curiosità; io so di awk, perl, C# ecc…. ma che cosa circa findstr?

 

2 Replies
  1. 4

    Se si desidera solo per trovare due spazi consecutivi:

    findstr /C:"  " input.txt
    

    O in case-insensitive espressione regolare:

    findstr /R /I /C:"lo  wo" input.txt
    

    Il bit importante è il /C: nella parte anteriore del modello. Questo dice findstr per trattare il modello come una stringa letterale. Senza di essa, findstr divide il motivo in più dei modelli di spazi. Che, nella mia esperienza, non è mai ciò che si desidera.

    Aggiornamento

    Di fare due o più spazi tra le lettere:

    findstr /R /I /C:"[a-z]   *[a-z]" input.txt
    

    Nota che ci sono tre spazi nel modello. Questo corrisponde a una lettera, due spazi seguito da zero o più spazi (ad esempio due o più spazi) e un’altra lettera.

    • Infatti devo rilevare 2 o più spazi tra “parole”. So findstr abbastanza bene. Quello che non so è se esiste un trucco per usarlo per un problema che vi ho appena descritto. (IMHO, invece di usare la “c:” l’interruttore, si può sempre utilizzare il semplice vecchio tipo find, non findstr)
    • trovare non è fare le espressioni regolari, per quanto ne so.
    • Ho aggiornato la mia risposta
    • La risposta opere come scritto, ma stare attenti con la regex classe di caratteri gamme. Non funzionano il modo in cui pensi. [a-z] corrisponde a tutti superiore e inferiore alfa caratteri (compresi i non-inglese diacriticals) tranne che per Z, anche se la ricerca è case sensitive. Un equivalente di ricerca senza /I opzione sarebbe findstr /R /C:"[a-zZ] *[a-zZ]" input.txt. Vedere la sezione intitolata “Regex classe di caratteri intervalli: [x-y]”, in fondo stackoverflow.com/a/8844873/1012053 per ulteriori informazioni.
  2. 0

    Di trovare due o più spazi consecutivi tra le lettere:

    C:\Users\harry> findstr /i /r /c:"o  [ ]*w" test.txt
    Hello  world!
    Hello   world!
    

    Traduzione: partita righe contenenti la ‘o’, due spazi, zero o più spazi, ‘w’. (Le parentesi quadre sono ridondanti, ma per aggiungere chiarezza.) Presumibilmente, si sa già che findstr /? vi darà un riepilogo della sintassi delle espressioni regolari?

    Come per la seconda parte della tua domanda: come arx già sottolineato, il motivo di non ottenere i risultati che ci aspettiamo è che non si sta utilizzando il C /C di bandiera. Considerare il primo comando:

    findstr -i -r  "view[ ]*data.sub" "view data sub.acf"
    

    Questo viene interpretato come una ricerca di qualsiasi linea che corrispondono a uno dei due espressioni regolari, view[ e ]*data.sub. Ho fatto alcuni esperimenti e credo che il primo regex è di essere scartato come una forma non corretta, o interpretato nel senso che impone una partita da un insieme vuoto di caratteri. Il secondo regex è interpretato come segue: zero o più ‘]’, ‘data’, con un carattere arbitrario, ‘sub’. Come accade, questo corrisponde con le stesse linee come il singolo regex è pensato che si stava utilizzando. Non è così quando togli l’asterisco:

    findstr -i -r  "view[ ]data.sub" "view data sub.acf"
    

    Ora la seconda regex è interpretato come segue: esattamente una ‘]’, ‘data’, con un carattere arbitrario, ‘sub’. Dal momento che la stringa ‘]dati ” non si verifica nel vostro testo, che nessuna delle linee partita. Invece, si dovrebbe specificare /c:

    findstr /i /r /c:"view[ ]data.sub" "view data sub.acf"
    

    Ora si sta cercando una singola regex: ‘visualizza’, uno spazio, ‘data’, un carattere arbitrario, ‘sub’. Questo è presumibilmente quello che volevo fare.

    • OK, pian piano mi sto punto. Ora si potrebbe si prega di spiegare a me (“tradurre”) la seguente frase in findstr /? output del comando: “/C:string Uses specified string as a **literal** search string.“?
    • A quanto pare, in questo contesto, la parola “letterale” per dire “non separate in archi di spazi”. Questo è un peccato, dato che usano la stessa parola con significato diverso in precedenza nel testo stesso. Forse quella frase è stata scritta prima di findstr supportato espressioni regolari, o semplicemente una persona diversa, che non pensavo sulle espressioni regolari al momento.
    • >>…stanno usando la parola “letterale” per dire “non separate in archi di spazi”.
    • >>…stanno usando la parola “letterale” per dire “non separate in archi di spazi”. Wow! Grazie mille Harry. Ora sto bene con findstr interpretazione degli spazi. “C:” switch è più utile di quanto ho pensato che fosse, da quella descrizione strumenti. Sono impressionato con stackoverflow.com!
    • In realtà la situazione è un po ‘ più complicato. Non solo è /C:"search" mai dividere gli spazi, è interpretted come una stringa letterale per impostazione predefinita. Essa può essere trattata come un’espressione regolare se il /R opzione è specificata. Questo contrasta con "search" passato come un semplice ragionamento. Essa è suddivisa in ogni spazio in più stringhe di ricerca e di ogni stringa può essere interpretato come un valore letterale o una regex, a seconda del contenuto della prima stringa. Vedere la sezione “tipo di ricerca: Letterale vs Espressione Regolare”, in stackoverflow.com/a/8844873/1012053 per ulteriori informazioni.

Lascia un commento