Voglio modificare a livello di codice il contenuto del file utilizzando la riga di comando di Windows ( cmd.exe ). In * nix c'è sed per questo compito. C'è qualche equivalente nativo utile in Windows?
Voglio modificare a livello di codice il contenuto del file utilizzando la riga di comando di Windows ( cmd.exe ). In * nix c'è sed per questo compito. C'è qualche equivalente nativo utile in Windows?
Risposte:
Oggi PowerShell mi ha salvato.
Perché grep
c'è:
get-content somefile.txt | where { $_ -match "expression"}
o
select-string somefile.txt -pattern "expression"
e perché sed
c'è:
get-content somefile.txt | %{$_ -replace "expression","replace"}
Per maggiori dettagli vedi il blog di Zain Naboulsis .
sed
(e il suo simile) sono contenuti in diversi pacchetti di comandi Unix.
sed
, grep
ecc. fuori dalla scatola, però.-z
opzione diversamente dalle porte superiori elencateSe non si desidera installare nulla e il vostro sistema non è un Windows Server uno, allora si potrebbe utilizzare un linguaggio di scripting (VBScript per esempio) per questo. Di seguito è riportato un grosso colpo al braccio. La tua riga di comando sarebbe simile
cscript //NoLogo sed.vbs s/(oldpat)/(newpat)/ < inpfile.txt > outfile.txt
dove oldpat e newpat sono modelli regex di Microsoft vbscript . Ovviamente ho implementato solo il comando sostitutivo e assunto alcune cose, ma potresti renderlo più intelligente e comprendere meglio la sed
riga di comando.
Dim pat, patparts, rxp, inp
pat = WScript.Arguments(0)
patparts = Split(pat,"/")
Set rxp = new RegExp
rxp.Global = True
rxp.Multiline = False
rxp.Pattern = patparts(1)
Do While Not WScript.StdIn.AtEndOfStream
inp = WScript.StdIn.ReadLine()
WScript.Echo rxp.Replace(inp, patparts(2))
Loop
Se non vuoi installare nulla (suppongo che tu voglia aggiungere lo script in qualche soluzione / programma / etc che verrà eseguito su altre macchine), potresti provare a creare uno script vbs (diciamo, sostituisci.vbs):
Const ForReading = 1
Const ForWriting = 2
strFileName = Wscript.Arguments(0)
strOldText = Wscript.Arguments(1)
strNewText = Wscript.Arguments(2)
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFileName, ForReading)
strText = objFile.ReadAll
objFile.Close
strNewText = Replace(strText, strOldText, strNewText)
Set objFile = objFSO.OpenTextFile(strFileName, ForWriting)
objFile.Write strNewText
objFile.Close
E lo esegui in questo modo:
cscript replace.vbs "C:\One.txt" "Robert" "Rob"
Che è simile alla versione sed fornita da "bill weaver", ma penso che questo sia più amichevole in termini di caratteri speciali ('> </).
A proposito, non ho scritto questo, ma non ricordo da dove l'ho preso.
> (Get-content file.txt) | Foreach-Object {$_ -replace "^SourceRegexp$", "DestinationString"} | Set-Content file.txt
Questo è il comportamento di
sed -i 's/^SourceRegexp$/DestinationString/g' file.txt
Potresti provare PowerShell. Ci sono commandlet get-content e set-content integrati che puoi usare.
sed
fa ;-). L' -replace
operatore è probabilmente un suggerimento migliore.
Prova fart.exe. È un'utilità Trova e sostituisci testo che può essere utilizzata nei programmi batch di comando.
È possibile installare Cygwin ( http://www.cygwin.com/ ) e utilizzare sed da lì.
Uso Cygwin . Incontro molte persone che non si rendono conto che se metti i binari Cygwin sul tuo PERCORSO, puoi usarli dalla shell dei comandi di Windows. Non è necessario eseguire Cygwin's Bash.
Puoi anche consultare i servizi Windows per Unix disponibili da Microsoft (ma solo sulle versioni Professional e precedenti di Windows).
edlin o modifica
inoltre ci sono i servizi Windows per Unix forniti con molti strumenti unix per Windows. http://technet.microsoft.com/en-us/interopmigration/bb380242.aspx
Aggiornamento 12/7/12 In Windows 2003 R2, Windows 7 e Server 2008, ecc. Quanto sopra è sostituito dal sottosistema per le applicazioni basate su UNIX (SUA) come componente aggiuntivo. Ma devi scaricare i programmi di utilità: http://www.microsoft.com/en-us/download/details.aspx?id=2391
Esiste un file batch di supporto per Windows chiamato repl.bat
che ha molte delle capacità di SED ma doesn't require any additional download
o di installazione. È un file batch ibrido che utilizza Jscript
per implementare le funzionalità e così è swift
, e doesn't suffer from the usual poison characters
per l'elaborazione batch e gestisce facilmente le righe vuote.
Scarica repl
da - https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat
L'autore è @dbenham dallo stack overflow e dostips.com
Un altro file batch di supporto chiamato findrepl.bat
offre all'utente Windows la maggior parte delle capacità GREP
e si basa anche su Jscript
un file batch ibrido. Condivide i vantaggi di repl.bat
Scarica findrepl
da - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat
L'autore è @aacini dallo stack overflow e dostips.com
Per quanto ne so nulla di simile a sed è in bundle con Windows. Tuttavia, sed è disponibile per Windows in diverse forme, anche come parte di Cygwin, se si desidera un sottosistema POSIX completo o come eseguibile nativo Win32 se si desidera eseguire solo sed dalla riga di comando.
Sed per Windows (progetto GnuWin32)
Se deve essere nativo di Windows, l'unica altra cosa che posso suggerire sarebbe quella di utilizzare un linguaggio di scripting supportato da Windows senza componenti aggiuntivi, come VBScript.
Avevo bisogno di uno strumento sed che funzionasse per il prompt di Windows cmd.exe. Il port di sed di Eric Pement su un singolo file .exe DOS ha funzionato perfettamente per me.
È abbastanza ben documentato .