2008-09-24 87 views
121

Quiero editar programáticamente el contenido del archivo usando la línea de comandos de Windows (cmd.exe). En * nix hay sed para estas tareas. ¿Hay algún equivalente útil en Windows?¿Hay alguna utilidad sed para cmd.exe

Editar: Estoy buscando una solución de línea de comando nativa.

+1

¿Qué quiere decir con "nativo" ??? Instalable para trabajar en cmd.exe, o para trabajar sin instalación alguna? Si el primero, consulte GnuWin32 ref'd a continuación; si este último, no. Sin sed nativo preinstalado para Windows. –

+2

Por nativo me refiero a la solución que se ejecuta en todas las ventanas sin instalar cosas adicionales. –

+1

Deje atrás cmd.exe y use PowerShell. –

Respuesta

77

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

Si no desea instalar nada y su sistema no es un servidor de Windows, entonces usted podría uso un lenguaje de scripting (VBScript, por ejemplo) para eso. Debajo hay una puñalada gruesa y fuera de lugar. Su línea de comandos vería como

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

donde oldpat y newpat son Microsoft vbscript regex patterns. Obviamente, solo he implementado el comando sustituto y he asumido algunas cosas, pero podría completarlo para ser más inteligente y comprender más 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 
+1

Esto no es exactamente lo que quiero, pero creo que la dependencia de VBS es la solución más liviana. –

+0

De todos modos, muchas gracias y todas las demás por las respuestas. –

+6

GnuWin32 _es_ una solución nativa, si por nativo quieres decir diseñado para ejecutarse en el entorno de Windows "normal" (a diferencia de CygWin). Pruébelas y comenzará a esperar que estén en TODOS los sistemas de Windows que use. !!! –

4

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 & Server 2008, etc. lo anterior se sustituye por el subsistema para aplicaciones basadas en UNIX (SUA) como un add-on. Pero tiene que descargar las utilidades: http://www.microsoft.com/en-us/download/details.aspx?id=2391

+3

Ambos ya no existen en las versiones de 64 bits de Windows. – Joey

3

Puede mirar GNU Tools, proporcionan (entre otras cosas) sed en windows.

1

Cygwin funciona, pero las utilidades these 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).

2

Por lo que sé, nada como sed se incluye 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.

Sed for Windows (GnuWin32 Project)

Si tiene que ser nativo de Windows entonces la única otra cosa que puedo sugerir sería utilizar un lenguaje de programación compatible con Windows sin complementos, como VBScript.

6

Puedes probar powershell. Hay get-content y set-content compilación de comandos que puede usar.

+4

Esas son probablemente las dos cosas en PowerShell que contribuyen menos a lo que 'sed' hace ;-). El operador '-replace' es probablemente una mejor sugerencia. – Joey

6

Yo uso Cygwin. 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 Windows Services for Unix disponible de Microsoft (pero solo en las versiones Profesional y anterior de Windows).

0

Esto funciona en Vista Ultimate, no estoy seguro Pro.

SED -f commandfilename.cmd archivo1> fichero2

8

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.

16

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 (por ejemplo, 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 ejecuta así:

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

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

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

84

Hoy en día, Powershell me salvó.

Para grep se encuentra:

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

y para sed se encuentra:

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

Para más detalles ver Zain Naboulsis blog entry.

+8

Además: si desea llamarlo desde un cmd normal, simplemente @powershell -Command "get-content ...". La única advertencia es que debe escapar de las comillas: ... -Command "get-content ... \" expression \ ", ..." – Tarc

+1

@Tarc AFAIR, puede usar comillas simples en su comando y usar comillas dobles para citar el comando en su lugar – vaxquis

+1

Intenté esto hoy en un archivo para eliminar algunas cosas entre comillas en ciertos lugares, solo para descubrir que el resultado era un archivo casi dos veces más grande que el original. La razón parecía ser que este método cambió la forma en que se manejaban las nuevas líneas en el archivo para usar "\ r \ n" en lugar de "\ n". – user132278

7

Pruebe fart.exe. Es una utilidad Buscar y reemplazar texto que se puede usar en programas por lotes de comandos.

http://sourceforge.net/projects/fart-it/

+0

Si realmente no puedo usar una shell * nix like, prefiero esto ya que es un pequeño y autónomo exe sin dependencias. – Qben

1

necesitaba una herramienta de sed que trabajó para el símbolo del cmd.exe de Windows. Eric Pement's port of sed to a single DOS .exe funcionó muy bien para mí.

Está bastante bien documented.

+0

La pregunta es sobre ** Windows ** (cmd.exe) no sobre DOS –

+0

@royhowie: Ya veo. Aunque algunas de estas respuestas pueden ser útiles para alguien, estoy de acuerdo con que la pregunta en sí misma no es realmente adecuada para SO. OTOH, no me siento capacitado para recomendar la eliminación al por mayor. –

+0

En esta situación, creo que sería difícil incluir las partes esenciales de la respuesta, ya que la parte esencial es un archivo .exe alojado en la página vinculada. Entiendo totalmente la preocupación sobre la podredumbre de enlace, no estoy seguro de cómo podría hacerlo autónomo para SO. –

4
> (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 
+0

Funciona perfectamente. Nota: los paréntesis en "get-content" aseguran que el archivo no se utilizará más adelante cuando se invoque "set-content". – Kafu

1

Hay un archivo por lotes de ayuda para Windows llamado repl.bat que tiene gran parte de la capacidad de la SED, pero doesn't require any additional download o instalación. Es un archivo de proceso por lotes híbrido que usa Jscript para implementar las funciones y también lo es swift, y doesn't suffer from the usual poison characters de procesamiento por lotes y maneja las líneas en blanco con facilidad.

Descargar repl de - https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

El autor es @dbenham de desbordamiento de pila y dostips.com

Otro archivo por lotes llamado ayudante findrepl.bat da al usuario de Windows gran parte de la capabilty 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

Descarga de findrepl - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

El autor es @aacini de desbordamiento de pila y dostips.com

Cuestiones relacionadas