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 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 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, grepetc. fuera de la caja, sin embargo.-zopciones 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 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
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.
sedhace ;-). El -replaceoperador 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.batque tiene mucha de la capacidad de SED pero doesn't require any additional downloado instalación. Es un archivo por lotes híbrido que se utiliza Jscriptpara implementar las características y así es swift, y doesn't suffer from the usual poison charactersde procesamiento por lotes y maneja líneas en blanco con facilidad.
Descargar repldesde - 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.batofrece al usuario de Windows gran parte de la capacidad GREPy también se basa en Jscriptun archivo por lotes híbrido. Comparte los beneficios de repl.bat
Descargar findrepldesde - 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 .