windows - ¿Hay alguna utilidad sed para cmd.exe
(17)
Cygwin funciona, pero UnxUtils utilidades también están disponibles. Solo colóquelos en su disco, coloque el directorio en su camino y tendrá muchas de sus utilidades amigables para Unix. Lighterweight en mi humilde opinión que Cygwin (aunque eso funciona igual de bien).
Esto funciona en Vista Ultimate, no estoy seguro de Pro.
sed -f archivo de nombre de comando.cmd archivo1> archivo2
Hasta donde sé, nada como sed está empaquetado con ventanas. Sin embargo, sed está disponible para Windows en varias formas diferentes, incluso como parte de Cygwin, si desea un subsistema POSIX completo o como un ejecutable nativo de Win32 si desea ejecutar simplemente sed en la línea de comando.
Si debe ser nativo de Windows, la única otra cosa que puedo sugerir sería usar un lenguaje de scripts compatible con Windows sin complementos, como VBScript.
Hay Super Sed una versión mejorada de sed. Para Windows, este es un .exe independiente, destinado a ejecutarse desde la línea de comandos.
Hay un archivo de ayuda por lotes para Windows llamado repl.bat
que tiene mucha capacidad de SED pero doesn''t require any additional download
o instalación doesn''t require any additional download
. Es un archivo de proceso por lotes híbrido que utiliza Jscript
para implementar las características y, por lo tanto, es swift
, y doesn''t suffer from the usual poison characters
del procesamiento por lotes y maneja las líneas en blanco con facilidad.
Descargar repl
desde - https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat
El autor es @dbenham de y dostips.com
Otro archivo de ayuda por lotes llamado findrepl.bat
brinda al usuario de Windows gran parte de la capacidad de GREP
y también se basa en Jscript
y también es un archivo de proceso por lotes híbrido. Comparte los beneficios de repl.bat
Descargue findrepl
desde - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat
El autor es @aacini de y dostips.com
Hoy PowerShell me salvó.
Para grep
hay:
get-content somefile.txt | where { $_ -match "expression"}
y para sed
hay:
get-content somefile.txt | %{$_ -replace "expression","replace"}
Para más detalles, ver la entrada del blog de Zain Naboulsis .
Necesitaba una herramienta sed que funcionaba para el indicador de Windows cmd.exe. El puerto de sed de Eric Pement para un solo .exe de DOS funcionó muy bien para mí.
Está bastante bien documented .
Podrías probar Powershell. Hay compilaciones de comandos get-content y set-content que puede usar.
Pruebe fart.exe. Es una utilidad Buscar y reemplazar texto que se puede usar en programas por lotes de comandos.
Puede instalar Cygwin ( http://www.cygwin.com/ ) y usar sed desde allí.
Puedes ver las GnuWin32 , que proporcionan (entre otras cosas) sed en las ventanas.
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, 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
Y lo ejecutas así:
cscript replace.vbs "C:/One.txt" "Robert" "Rob"
Lo cual es similar a la versión sed proporcionada por "bill weaver", pero creo que este es más amigable en términos de caracteres especiales (''> </).
Por cierto, no escribí esto, pero no recuerdo de dónde lo saqué.
Yo uso http://www.cygwin.com/ . Me encuentro con mucha gente que no se da cuenta de que si pones los binarios de Cygwin en tu RUTA, puedes utilizarlos desde dentro del shell de comandos de Windows. No tienes que ejecutar Cygwin''s Bash.
También puede consultar Servicios de Windows para Unix disponibles en Microsoft (pero solo en Professional y versiones anteriores de Windows).
edlin o editar
Además, hay servicios de Windows para Unix que viene con muchas herramientas de Unix para Windows. http://technet.microsoft.com/en-us/interopmigration/bb380242.aspx
Actualización 12/7/12 En Windows 2003 R2, Windows 7 y Server 2008, etc., lo anterior es reemplazado por el subsistema para aplicaciones basadas en UNIX (SUA) como un complemento. Pero debe descargar las utilidades: http://www.microsoft.com/en-us/download/details.aspx?id=2391
sed
(y su tipo) 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.
- El Subsistema de Windows para Linux es la opción más "nativa", pero no está instalado en Windows de manera predeterminada; Sin embargo, tiene
sed
,grep
, etc. - https://github.com/mbuilov/sed-windows ofrece versiones recientes 4.3 y 4.4, que admiten la opción
-z
diferencia de los puertos superiores listados
Si no desea instalar nada y su sistema no es uno de Windows Server, entonces podría usar un lenguaje de scripts (VBScript, por ejemplo) para eso. Debajo hay una puñalada gruesa y fuera de lugar. Su línea de comando se vería como
cscript //NoLogo sed.vbs s/(oldpat)/(newpat)/ < inpfile.txt > outfile.txt
donde oldpat y newpat son patrones de Microsoft vbscript regex . Obviamente, solo he implementado el comando sustituto y asumido algunas cosas, pero podría desarrollarse para ser más inteligente y comprender más de la línea de comandos 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
> (Get-content file.txt) | Foreach-Object {$_ -replace "^SourceRegexp$", "DestinationString"} | Set-Content file.txt
Este es el comportamiento de
sed -i ''s/^SourceRegexp$/DestinationString/g'' file.txt