Regex Sostituisci dalla riga di comando


21

È possibile regex sostituire dalla riga di comando? In questo momento sto usando Notepad ++ per fare questo. Nella riga di comando posso usare solo FINDSTR che può solo localizzare i file / le linee elaborati

EDIT:
Forse sarà possibile creare uno script VB ed eseguirlo da cmd? Ho appena creato un file "hi.vbs" con il contenuto

Msgbox "Hi Buddy"

Quindi cmd mi permette di eseguirlo direttamente digitando "hi" dalla riga di comando.
Quindi, se non è possibile con lo script batch, allora potrei usare un batch VB tramite script. O..?


Alla fine hai messo una frase inconcludente e l'intera parte EDIT non indica il problema è più simile a "Creo un mondo ciao in vb, posso creare qualcosa del genere in batch? Controlla la risposta inviata da @IanPugsley è il modo semplice per fare regex-sostituisci
mjsr

@Aziz: qualcuno di queste risposte ha funzionato per te? Se è così, accetteresti quello? Fa parte della partecipazione a questa comunità; il modo in cui ci ringraziamo per l'aiuto. I punti reputazione assegnati per una risposta accettata aiutano gli altri utenti a valutare l'esperienza reciproca. Grazie.
JRobert,

Stavo pensando di chiamare qualcosa come MYVBREPLACE (.vbs) FILENAME REGEXPATTERN REPLACEMENT dalla riga di comando.
Aziz,

Risposte:


11

vai qui
http://gnuwin32.sourceforge.net/packages.html
scorrere fino a SED. Scarica coreutils anche mentre ci sei.

questo comando sostituirà a con b a livello globale e su ciascuna riga. quindi non solo la prima occorrenza sulla linea.

ad es. usando sed "s / a / b / g" a.txt

C:\>type a.txt
aaaa
aaa

C:\>sed "s/a/b/" a.txt
baaa
baa

C:\>sed "s/a/b/g" a.txt
bbbb
bbb

C:\>

VBScript supporta le espressioni regolari, puoi trovarle e sostituirle.

dim re, s
set re = new RegExp

re.Pattern="in"
re.Global=True 'false is default
s="bin din in"
MsgBox re.Replace(s,"xxx")

Visualizza bxxx dxxx xxx


Strumento pazzo incredibile !!! Questo strumento era troppo avanzato. Non sono ancora riuscito a usarlo, ma quando leggo gnu.org/software/sed/manual/sed.html#The-_0022s_0022-Command posso vedere che questo può fare molto di più di quello che mi aspettavo. Grazie mille
Aziz,

Le nuove versioni di bash possono anche fare espressioni regolari, a volte è sufficiente per compiti semplici e non è necessario utilizzare nemmeno sed.
vtest

e ri che cosa ha detto vtest, nel caso nessuno lo sappia. cygwin ha bash.
barlop

sed fa schifo con sostituzioni multilinea però
kofifus

1
@KennyEvitt cmd shell richiede un tweak per farlo visualizzare e l'uso di chcp per Unicode utf8 chcp 65001 (come dici tu, UTF16 encoding.chcp 1200 e chcp 12001 non è supportato) stackoverflow.com/questions/9321419/...~~V~~singular~~3rd Non sono sicuro ri mintty. Non sono sicuro di PowerShell. Ma utf-8 è supportato ok in cmd o powershell. Finché un font di supporto viene utilizzato come nuovo corriere, e purché sia ​​codepage 65001. Esiste un cmd / u per una codifica utf16.
barlop

26

A tale scopo, ho scritto uno strumento da riga di comando gratuito per Windows. Si chiama rxrepl , supporta Unicode e la ricerca di file. Alcuni potrebbero trovarlo uno strumento utile.

rxrepl è uno strumento da riga di comando di Microsoft Windows per cercare e sostituire il testo nei file di testo utilizzando le espressioni regolari compatibili Perl (PCRE).

Ha le seguenti caratteristiche:

  • Cerca usando le espressioni regolari compatibili Perl
  • Usa la corrispondenza di gruppo nel testo sostitutivo
  • Supporta terminazioni di linea Windows e Unix
  • Supporto Unicode
  • Accetta più argomenti di ricerca / sostituzione
  • Le opzioni possono essere fornite in un file di opzioni
  • Cerca file
  • Modalità anteprima
  • Modalità di corrispondenza riga e file completo

inserisci qui la descrizione dell'immagine


4
Questo è fantastico! Se sei come me e hai bisogno di esempi, questo sostituisce "foobar" con "foofighters" in un file: rxrepl.exe -f file.txt -a -s "(foo) bar" -r "\ 1fighters"
Dunc

1
Inoltre, ti capita di avere la fonte su qualcosa come Github? Totalmente comprensibile se non è pensato per essere open source, ma sono molto curioso.
kayleeFrye_onDeck

1
@Steztric Davvero? Sto eseguendo Windows a 64 bit e sembra che non ci siano problemi da questoC:\WINDOWS\System32\cmd.exe
kayleeFrye_onDeck

1
Strumento fantastico! Esecuzione senza problemi con Windows Server Std 2012 R2 x64. Grazie!
kwrl,

2
Ottimo strumento, spero che tu lo stia ancora mantenendo
acquoso

12

Scripting Guy spiega come eseguire questa operazione in PowerShell (nessun download aggiuntivo sui più recenti sistemi operativi Windows, probabilmente lo hai già installato).

Avviarlo, eseguire quanto segue (per sostituire a *con a @):

(Get-Content C:\Scripts\Test.txt) | 
Foreach-Object {$_ -replace "\*", "@"} | 
Set-Content C:\Scripts\Test.txt

Questo supporta le espressioni regolari di .NET , incluso il look-look positivo e negativo, e tutto ciò che notepad ++ non supportava con regex prima della versione 6.x (tanto quanto adoro Notepad ++).


1
Notepad ++ supporta PCRE completo dalla versione 6.
Bob,

5

Ho trovato fnr.exe per quello. Ha GUI e riga di comando.

Uno strumento open source per trovare e sostituire il testo in più file.

Caratteristiche

  • Download singolo file - fnr.exe (127kb)
  • Sostituisci il testo in più file utilizzando l'applicazione Windows o la riga di comando
  • Trova solo per vedere dove si trovano le partite
  • Ricerca con distinzione tra maiuscole e minuscole
  • Ricerca di file in una directory o sottodirectory ricorrenti
  • Espressioni regolari
  • Trova e sostituisci testo su più righe
  • Genera il pulsante della riga di comando per creare il testo della riga di comando da inserire nel file batch
  • Guida della riga di comando
  • Prove unitarie di Trova / Sostituisci motore

Visualizzazione delle opzioni della riga di comando

inserisci qui la descrizione dell'immagine


1
Molto carino: puoi controllare la tua istruzione "trova" nella GUI, fare clic su "Gen Sostituisci riga di comando" e prepararti a usare la chiamata da riga di comando. Non è necessario perdere tempo per acquisire familiarità con la sintassi della riga di comando.
sarh,

Non sono riuscito a farlo uscire dopo aver apportato le modifiche. Devo premere Invio per chiudere rendendo questo non particolarmente utile per gli script
G-.

@ G-. Non è necessario attendere <enter> se viene eseguito da un file batch.
Sergio,

Non sono riuscito a trovare un modo per generare un nome file / un'estensione diversi
Rick,

4

Sembra che tu possa usare regex con FINDSTR

findstr [Windows CMD] :

findstr consente di cercare il testo (come specificato con il motivo nel nome file del file. Se il nome file contiene caratteri jolly (* o?), cerca in tutti i file corrispondenti. L'opzione / S cerca nella directory corrente e nelle sue sottodirectory. Se il pattern contiene spazi, deve essere specificato in questo modo / C: "del testo da cercare". Per trasformare il pattern in espressioni regolari, è necessario utilizzare l'opzione / R. L'opzione / I cerca case insensibile.

Dall'aiuto di FindStr ( Findstr /?):

/ R: utilizza le stringhe di ricerca come espressioni regolari.

Regular expression quick reference:
  .        Wildcard: any character
  *        Repeat: zero or more occurrences 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

Grazie per la tua risposta, ma questa non era la mia domanda.
Aziz,

2
findstrimpossibile sostituire il testo nei file!
Kenny Evitt,

4

Sono un po 'in ritardo alla festa, ma JREPL.BAT è un'utilità regex ibrida basata su script JScript / batch che funziona nativamente su qualsiasi macchina Windows da XP in poi.

La documentazione completa è integrata nello script, a cui è possibile accedere tramite JREPL /?o utilizzare JREPL /??per l'output di paging.

JREPL utilizza regex ECMA standard fornito con JScript. Il regex ECMA non è potente quanto il regex .NET disponibile per PowerShell, ma è ancora dannatamente buono. E penso che l'utente medio troverà questa utility più facile da usare rispetto a PowerShell.

Le opzioni JREPL integrate forniscono già molta potenza intrinseca, ma la possibilità di iniettare JScript fornito dall'utente apre davvero incredibili possibilità.

Ho sviluppato lo script perché il mio posto di lavoro non consente il download di file exe non standard, ma non ha restrizioni sulla scrittura di script batch o JScript :-)

Segui semplicemente il link e copia il codice dello script in un file chiamato JREPL.BAT. Leggi i post successivi da quel thread per esempi di cronologia di utilizzo e sviluppo. Esistono anche molte risposte StackOverflow che utilizzano JREPL.BAT.


3

Due buone scelte sono Cygwin che ti darà un ambiente simile a Unix e simile a bash (alternativa a cmd.exe); e Unxutils , porte Win32 di una raccolta di singole utility Unix. In entrambi i pacchetti, vedere 'sed', 'awk' e 'grep'.


2
unxutils è vecchio. ora la cosa è gnuwin32
barlop

Grazie JRobert per il tuo suggerimento. Mi dispiace di non averlo sottostimato, ma ora posso vedere che SED era la cosa giusta.
Aziz,

@barlop dal 2018, gnuwin32 è ora anche vecchio .. cygwin è più aggiornato!
barlop

0

È inoltre possibile utilizzare GSAR per eseguire la ricerca e la sostituzione della riga di comando. Funziona anche con hex e binary. Non eseguirà il sollevamento pesante complesso che regex può eseguire, ma per la ricerca di base e la sostituzione, svolge il lavoro in modo rapido e semplice.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.