[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).










> (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



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.




Potresti guardare GnuWin32 , forniscono (tra le altre cose) su Windows.






Links