¿Existe alguna utilidad tipo sed para cmd.exe? [cerrado]
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?
Hoy powershell me salvó.
Porque grep
hay:
get-content somefile.txt | where { $_ -match "expression"}
o
select-string somefile.txt -pattern "expression"
y porque sed
hay:
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 .
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
,grep
etc., listos para usar. - https://github.com/mbuilov/sed-windows ofrece versiones recientes 4.3 y 4.4, que admiten
-z
opciones 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 sed
lí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
UnxUtils proporciona sed para Win32, al igual que GNUWin32 .
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é.
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.