¿Existe alguna utilidad sed like para cmd.exe? [cerrado]


149

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?


1
¿Qué quieres decir con "nativo"? ¿Instalable para trabajar en cmd.exe, o para trabajar sin instalación alguna? Si es lo primero, vea GnuWin32 ref'd abajo; si este último, no. No hay sed nativos preinstalados para Windows.
Michael Paulukonis

66
Por nativo me refería a la solución que se ejecuta en todas las ventanas sin instalar cosas adicionales.
Jakub Šturc

1
Deje cmd.exe atrás y use PowerShell en su lugar.
Bill_Stewart


Si solo desea eliminar ciertas líneas de un archivo, use FIND /?
John Henckel

Respuestas:


117

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 .


12
Además: si quieres llamarlo desde cmd normal, solo @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

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

1
Duplicar debido a \ r \ n implicaría que su archivo estaba compuesto únicamente de nuevas líneas. Aquí está la verdadera razón: la codificación .
Amit Naidu

2
@ and-bri (Get-Content c: \ temp \ test.txt) .replace ('[MYID]', 'MyValue') | Set-Content c: \ temp \ test.txt
AFP_555

94

sed (y sus características) están contenidos en varios paquetes de comandos de Unix.

Si 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

1
Esto no es exactamente lo que quiero, sin embargo, creo que la dependencia de VBS es la solución más ligera.
Jakub Šturc

77
GnuWin32 es una solución nativa, si por nativo quiere decir diseñado para ejecutarse en el entorno de Windows "normal" (a diferencia de CygWin). Pruébelos y comenzará a esperar que estén en CADA sistema de Windows que use. !!!
Michael Paulukonis

3
¡Funciona para mi caso! Además, no olvide la opción cscript "// NoLogo".
Marko Dumic

44
Si esto es "fuera de lugar", ¡pregúntese cómo se ve su otro código! Increíble, gracias.
Sabuncu

2
Una utilidad similar de búsqueda y reemplazo de expresiones regulares se puede hacer con JScript. La ventaja de JScript sobre VBScript es que se puede combinar fácilmente con un lote en un solo script, lo que hace que la utilidad sea más fácil de usar en un contexto de lote o línea de comando. Está disponible una robusta utilidad híbrida JScript / batch llamada REPL.BAT . Tiene muchas opciones de línea de comando. La documentación completa está incrustada en el script. Ciertamente no tiene plena capacidad sed, pero aun así, es bastante potente.
dbenham


17

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.


10

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.


8
> (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

1
Funciona perfectamente Nota: el paréntesis en "get-content" asegura que el archivo no se usará más tarde cuando se llame a "set-content".
Kafu

¿Es posible algo similar en cmd? en entender esto es solo para pwsh
Ferroao

¿Se sustituye 'SourceRegexp' por cualquier posible regex? ¿eso realmente funciona en power shell?
scjorge

7

Podrías probar PowerShell. Hay compilaciones de comandos get-content y set-content que puedes usar.


44
Esas son probablemente las dos cosas en PowerShell que contribuyen menos a lo que sedhace ;-). El -replaceoperador es probablemente una mejor sugerencia.
Joey



6

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).


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 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


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


3

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


El enlace de Dropbox para repl está inactivo. ¿Tienes un enlace secundario?
Vishal Anand

2

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.


1

Cygwin funciona, pero estas utilidades también están disponibles. Simplemente póngalos en su disco, coloque el directorio en su camino y tendrá muchas de sus amigables utilidades de Unix. En mi humilde opinión, Cygwin (aunque eso funciona igual de bien).


0

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 .


1
La pregunta es sobre Windows (cmd.exe) no sobre DOS
a_horse_with_no_name

@royhowie: Ya veo. Aunque algunas de estas respuestas pueden ser útiles para alguien, estoy de acuerdo en que la pregunta en sí no es realmente adecuada para SO. OTOH, no me siento calificado para recomendar la eliminación total.
PM 2Ring

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 por la rotura de enlaces, no estoy seguro de cómo podría hacer que esto sea autónomo para SO.
bryan kennedy

Gracias por la captura, a_horse_with_no_name. Estaba siendo descuidado con mi idioma. Edité mi comentario para solucionar el problema que usted señaló.
bryan kennedy
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.