Domanda

Voglio modificare a livello di codice il contenuto del file utilizzando la riga di comando di Windows ( cmd.exe ). In * nix c'è sed per queste attività. C'è qualche equivalente utile in Windows?

Modifica: sto cercando una soluzione nativa da riga di comando.

È stato utile?

Soluzione

Oggi PowerShell mi ha salvato.

Per grep c'è:

get-content somefile.txt | where { $_ -match "expression"}

e per sed c'è:

get-content somefile.txt | %{$_ -replace "expression","replace"}

Per maggiori dettagli vedi Blog di Zain Naboulsis .

Altri suggerimenti

sed (e il suo simile) sono contenuti in diversi pacchetti di comandi Unix.

Se non vuoi installare nulla e il tuo sistema non è Windows Server, allora potresti usare un linguaggio di scripting (ad es. VBScript). Di seguito è riportato un grosso colpo al braccio. La tua riga di comando sarebbe simile a

cscript //NoLogo sed.vbs s/(oldpat)/(newpat)/ < inpfile.txt > outfile.txt

dove oldpat e newpat sono Microsoft vbscript regex patterns . Ovviamente ho implementato solo il comando sostitutivo e assunto alcune cose, ma potresti renderlo più intelligente e comprendere meglio la <=> 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

UnxUtils fornisce sed per Win32, così come GNUWin32 .

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, sostituiscilo. 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 speciale ('> < / ) caratteri.

A proposito, non l'ho scritto, ma non ricordo da dove l'ho preso.

Esiste Super Sed una versione avanzata di sed. Per Windows questo è un file .exe autonomo, progettato per essere eseguito dalla riga di comando.

Prova fart.exe. È un'utilità di ricerca e sostituzione del testo che può essere utilizzata nei programmi batch di comando.

http://sourceforge.net/projects/fart-it/

> (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 installare Cygwin ( http://www.cygwin.com/ ) e usare sed da lì .

Potresti provare PowerShell. Ci sono get-content e set-content buildlet di comandi che è possibile utilizzare.

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 Servizi Windows per Unix disponibili da Microsoft (ma solo sulle versioni Professional e precedenti di Windows).

edlin o modifica

inoltre ci sono 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, ampli & Di Windows 7; Server 2008, ecc., Quanto sopra è sostituito dal sottosistema per le applicazioni basate su UNIX (SUA) come componente aggiuntivo. Ma devi scaricare le utility: http://www.microsoft.com/en-us/ scaricare / Details.aspx? id = 2391

Puoi guardare GNU Tools , che forniscono (tra le altre cose) sed su windows.

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 installazione. È un file batch ibrido che utilizza Jscript per implementare le funzionalità, così come swift e doesn't suffer from the usual poison characters dell'elaborazione batch e gestisce le righe vuote con facilità.

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 fornisce all'utente Windows gran parte della capacità di GREP e si basa anche su findrepl ed è anche un file batch ibrido. Condivide i vantaggi di repl.bat

Scarica <=> da - https://www.dropbox.com/s/ rfdldmcb6vwi9xc / findrepl.bat

L'autore è @aacini dallo stack overflow e dostips.com

Per quanto ne so nulla come 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.

Cygwin funziona, ma sono disponibili anche queste utilità. Basta rilasciarli sul disco rigido, inserire la directory nel percorso e disporre di molte delle utili utility unix. IMHO più leggero che Cygwin (anche se funziona altrettanto bene).

Avevo bisogno di uno strumento sed che funzionasse con il prompt di Windows cmd.exe. La porta di sed di Eric Pement su un singolo DOS .exe ha funzionato perfettamente per me .

È abbastanza bene documentato .

Funziona su Vista Ultimate, non sono sicuro di Pro.

sed -f commandfilename.cmd file1 > file2
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top