¿Existe alguna utilidad tipo sed para cmd.exe? [cerrado]

Resuelto Jakub Šturc asked hace 16 años • 16 respuestas

Quiero editar el contenido del archivo mediante programación usando la línea de comandos de Windows ( cmd.exe ). En *nix hay sed para estas tareas. ¿Existen equivalentes nativos útiles (cmd o ps) en Windows?

Jakub Šturc avatar Sep 24 '08 21:09 Jakub Šturc
Aceptado

Hoy powershell me salvó.

Porque grephay:

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

o

select-string somefile.txt -pattern "expression"

y porque sedhay:

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

Para obtener más detalles sobre la función de reemplazo de PowerShell, consulte este artículo de Microsoft .

Jakub Šturc avatar May 17 '2011 09:05 Jakub Šturc

sed(y similares) están contenidos en varios paquetes de comandos de Unix.

  • Cygwin funciona pero es gigantesco.
  • UnxUtils es mucho más delgado.
  • GnuWin32 es otro puerto que funciona.
  • Otra alternativa es el sistema UWIN de AT&T Research .
  • MSYS de MinGw es otra opción más.
  • El Subsistema de Windows para Linux es la opción más "nativa", pero no está instalado en Windows de forma predeterminada; Sin embargo, tiene sed, grepetc., listos para usar.
  • https://github.com/mbuilov/sed-windows ofrece versiones recientes 4.3 y 4.4, que admiten -zopciones a diferencia de los puertos superiores enumerados

Si no desea instalar nada y su sistema no es Windows Server, entonces puede usar un lenguaje de secuencias de comandos (por ejemplo, VBScript) para eso. A continuación se muestra una puñalada grosera e improvisada. Su línea de comando se vería así

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

donde oldpat y newpat son patrones de expresiones regulares de Microsoft vbscript . Obviamente solo implementé el comando sustituto y asumí algunas cosas, pero podrías desarrollarlo para ser más inteligente y comprender más la sedlínea de comandos.

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
b w avatar Sep 24 '2008 14:09 b w

UnxUtils proporciona sed para Win32, al igual que GNUWin32 .

Adam Hughes avatar Sep 24 '2008 14:09 Adam Hughes

Si no desea instalar nada (supongo que desea agregar el script a alguna solución/programa/etc. que se ejecutará en otras máquinas), puede intentar crear un script vbs (digamos, reemplazar.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

Y lo ejecutas así:

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

Que es similar a la versión sed proporcionada por "bill weaver", pero creo que esta es más amigable en términos de caracteres especiales (' > < / ).

Por cierto, no escribí esto, pero no recuerdo de dónde lo saqué.

Rober avatar Apr 20 '2011 10:04 Rober

Existe Super Sed, una versión mejorada de sed. Para Windows, este es un .exe independiente, diseñado para ejecutarse desde la línea de comandos.

Rob Kam avatar May 26 '2009 17:05 Rob Kam