[Windows] C'è qualche utilità come sed per cmd.exe


Answers

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

Se non si desidera installare nulla e il proprio sistema non è un server Windows, è possibile utilizzare un linguaggio di scripting (ad esempio VBScript). Sotto c'è una pugnalata grossolana. 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 solo implementato il comando sostitutivo e ho assunto alcune cose, ma potresti renderlo più intelligente e capire di più sulla linea di comando sed .

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
Question

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 utile in Windows?

Modifica: Sto cercando la soluzione nativa della linea di comando.




Cygwin funziona, ma UnxUtils utility sono anche disponibili. Basta trascinarli sul tuo disco, mettere la directory sul tuo percorso e avere molte delle tue utilissime utility UNIX. IMHO più leggero che Cygwin (anche se funziona altrettanto bene).




Se non vuoi installare nulla (presumo tu voglia aggiungere lo script in qualche soluzione / programma / etc che verrà eseguito su altre macchine), potresti provare a creare uno script vbs (diciamo, replace.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 tu lo esegui in questo modo:

cscript replace.vbs "C:\One.txt" "Robert" "Rob"

Che è simile alla versione di sed fornita da "bill weaver", ma penso che questo sia più amichevole in termini di caratteri speciali ('> </).

A proposito, non l'ho scritto, ma non riesco a ricordare 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 guardare GnuWin32 , forniscono (tra le altre cose) su Windows.