Quiero editar programáticamente el contenido del archivo usando la línea de comando de Windows ( cmd.exe ). En * nix hay sed para estas tareas. ¿Hay algún equivalente nativo útil en Windows?
Quiero editar programáticamente el contenido del archivo usando la línea de comando de Windows ( cmd.exe ). En * nix hay sed para estas tareas. ¿Hay algún equivalente nativo útil en Windows?
Respuestas:
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 más detalles ver la entrada del blog Zain Naboulsis .
sed
(y sus características) están contenidos en varios paquetes de comandos de Unix.
sed
, grep
etc. fuera de la caja, sin embargo.-z
opciones a diferencia de los puertos superiores enumeradosSi no desea instalar nada y su sistema no es de Windows Server, entonces puede usar un lenguaje de script (VBScript, por ejemplo) para eso. A continuación se muestra una puñalada asquerosa. Tu 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 vgecript regex de Microsoft . Obviamente, solo implementé el comando sustituto y asumí algunas cosas, pero podría 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
Si no desea instalar nada (supongo que desea agregar el script en 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"
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 obtuve.
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.
> (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
Podrías probar PowerShell. Hay compilaciones de comandos get-content y set-content que puedes usar.
sed
hace ;-). El -replace
operador es probablemente una mejor sugerencia.
Prueba fart.exe. Es una utilidad de Buscar y reemplazar texto que se puede usar en los programas por lotes de comandos.
Puede instalar Cygwin ( http://www.cygwin.com/ ) y usar sed desde allí.
Yo uso Cygwin . Me encuentro con muchas personas que no se dan cuenta de que si pones los binarios de Cygwin en tu RUTA, puedes usarlos desde el shell de comandos de Windows. No tiene que ejecutar Cygwin's Bash.
También puede consultar los Servicios de Windows para Unix disponibles de Microsoft (pero solo en las versiones Professional y superior 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 se reemplaza 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
Puede ver las herramientas GNU , que proporcionan (entre otras cosas) sed en las ventanas.
Hay un archivo por lotes auxiliar para Windows llamado repl.bat
que tiene mucha de la capacidad de SED pero doesn't require any additional download
o instalación. Es un archivo por lotes híbrido que se utiliza Jscript
para implementar las características y así es swift
, y doesn't suffer from the usual poison characters
de procesamiento por lotes y maneja líneas en blanco con facilidad.
Descargar repl
desde - https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat
El autor es @dbenham de desbordamiento de pila y dostips.com
Otro archivo por lotes auxiliar llamado findrepl.bat
ofrece al usuario de Windows gran parte de la capacidad GREP
y también se basa en Jscript
un archivo por lotes híbrido. Comparte los beneficios de repl.bat
Descargar findrepl
desde - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat
El autor es @aacini de stack overflow y dostips.com
Hasta donde yo sé, nada como sed está incluido en las 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 Win32 si desea ejecutar solo sed en la línea de comandos.
Sed para Windows (Proyecto GnuWin32)
Si necesita ser nativo de Windows, la única otra cosa que puedo sugerir sería usar un lenguaje de secuencias de comandos compatible con Windows sin complementos, como VBScript.
Necesitaba una herramienta sed que funcionara para el indicador cmd.exe de Windows. El puerto de Eric Pement de sed a un único .exe de DOS funcionó muy bien para mí.
Está bastante bien documentado .