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é grepc'è:
get-content somefile.txt | where { $_ -match "expression"}
o
select-string somefile.txt -pattern "expression"
e perché sedc'è:
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, grepecc. fuori dalla scatola, però.-zopzione 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 sedriga 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.
sedfa ;-). L' -replaceoperatore è 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.batche ha molte delle capacità di SED ma doesn't require any additional downloado di installazione. È un file batch ibrido che utilizza Jscriptper implementare le funzionalità e così è swift, e doesn't suffer from the usual poison charactersper l'elaborazione batch e gestisce facilmente le righe vuote.
Scarica replda - 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.batoffre all'utente Windows la maggior parte delle capacità GREPe si basa anche su Jscriptun file batch ibrido. Condivide i vantaggi di repl.bat
Scarica findreplda - 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 .