Regex reemplazar de la línea de comandos

19

¿Es posible regex reemplazar desde la línea de comandos? Ahora mismo estoy usando notepad ++ para hacer esto. En la línea de comandos solo puedo usar FINDSTR que solo puede localizar los archivos / líneas mecanizados

EDITAR:
Tal vez sea posible hacer un script VB y ejecutarlo desde cmd? Acabo de crear un archivo "hi.vbs" con el contenido.

Msgbox "Hi Buddy"

Luego, cmd me permite ejecutarlo directamente escribiendo "hola" desde la línea de comandos.
Entonces, si no es posible con un script por lotes, entonces puedo usar un lote de scripts VB. O..?

Aziz
fuente
Al final, pones una oración inconclusa y la parte EDIT no está apuntando al problema, es más como "Creo un mundo hola en vb, ¿puedo crear algo así en el lote? Comprueba la respuesta publicada por @IanPugsley es la Una forma fácil de hacer regex-replace.
mjsr
@Aziz: ¿alguna de estas respuestas te ha funcionado? Si es así, ¿aceptarías eso? Eso es parte de participar en esta comunidad; la forma en que nos agradecemos por ayuda Los puntos de reputación dados para una respuesta aceptada ayudan a otros usuarios a evaluar la experiencia de otros. Gracias.
JRobert
Estaba pensando en llamar algo como MYVB REPLACE (.vbs) REEMPLAZO DE MODELO DE REGEXO DE REGENAME desde la línea de comandos.
Aziz

Respuestas:

10

ven aquí
http://gnuwin32.sourceforge.net/packages.html
desplácese hacia abajo hasta SED. Descarga coreutils también mientras estás en ello.

este comando reemplazará a con b globalmente, y en cada línea. así que no solo la primera aparición en la línea.

p.ej. utilizando sed "s / a / b / g" a.txt

C:\>type a.txt
aaaa
aaa

C:\>sed "s/a/b/" a.txt
baaa
baa

C:\>sed "s/a/b/g" a.txt
bbbb
bbb

C:\>

VBScript soporta expresiones regulares, puedes encontrarlo y reemplazarlo.

dim re, s
set re = new RegExp

re.Pattern="in"
re.Global=True 'false is default
s="bin din in"
MsgBox re.Replace(s,"xxx")

Muestra bxxx dxxx xxx

barlop
fuente
Increíble herramienta loca !!! Esta herramienta era demasiado avanzada. No pude usarlo todavía, pero cuando leí gnu.org/software/sed/manual/sed.html#The-_0022s_0022-Command Puedo ver que esto puede hacer mucho más de lo que podría esperar. Muchas gracias
Aziz
Las nuevas versiones de bash también pueden hacer expresiones regulares, a veces eso es suficiente para tareas sencillas y no hay necesidad de usar incluso sed.
vtest
y re lo que diga, en caso de que alguien no lo sepa. cygwin tiene bash.
barlop
sed chupa con reemplazos multilínea aunque
kofifus
1
La shell @KennyEvitt cmd requiere un ajuste para que se muestre y use chcp para unicode utf8 chcp 65001 (como usted dice, utf16 encoding.chcp 1200 y chcp 12001 no son compatibles) stackoverflow.com/questions/9321419/… No estoy seguro. No estoy seguro de volver a PowerShell. Pero utf-8 se admite bien en cmd o powershell. Siempre y cuando una fuente de soporte se use como mensajería nueva, y siempre que sea la página de códigos 65001. Hay un cmd / u para una codificación utf16.
barlop
23

He escrito una herramienta de línea de comandos gratuita para Windows para hacer esto. Se llama rxrepl , soporta Unicode y búsqueda de archivos. Algunos pueden encontrar una herramienta útil.

rxrepl es una herramienta de línea de comandos de Microsoft Windows para buscar y reemplazar texto en archivos de texto usando expresiones regulares compatibles con Perl (PCRE).

Tiene las siguientes características:

  • Búsqueda usando expresiones regulares compatibles con Perl
  • Utilice la coincidencia de grupos en el texto de reemplazo
  • Soporta finales de línea de Windows y Unix.
  • Soporte Unicode
  • Acepta múltiples argumentos de búsqueda / reemplazo
  • Las opciones se pueden proporcionar en un archivo de opciones
  • Escanear en busca de archivos
  • Modo de vista previa
  • Modos de alineación de línea y archivo completo

enter image description here

user2005187
fuente
3
¡Esto es increíble! Si eres como yo y necesitas ejemplos, esto reemplaza "foobar" con "foofighters" en un archivo: rxrepl.exe -f archivo.txt -a -s "(foo) barra" -r "\ 1fighters"
Dunc
1
Además, ¿tendrías la fuente en algo como github? Totalmente comprensible si no está destinado a ser de código abierto, pero tengo mucha curiosidad.
kayleeFrye_onDeck
1
@Steztric ¿De verdad? Estoy ejecutando ventanas de 64 bits y parece que no tengo problemas para ejecutar esto desde C:\WINDOWS\System32\cmd.exe
kayleeFrye_onDeck
1
Herramienta impresionante! Ejecutando sin problemas bajo Windows Server Std 2012 R2 x64. ¡Gracias!
kwrl
2
Gran herramienta, espero que aún la estés manteniendo.
watery
10

El chico del scripting cubre Cómo hacer esto en PowerShell. (No hay descargas adicionales en los sistemas operativos más recientes de Windows, probablemente ya lo tenga instalado).

Inicia, ejecuta lo siguiente (para reemplazar un * con un @ ):

(Get-Content C:\Scripts\Test.txt) | 
Foreach-Object {$_ -replace "\*", "@"} | 
Set-Content C:\Scripts\Test.txt

Esto apoya Expresiones regulares .NET , incluyendo la anticipación positiva y negativa, y todo tipo de cosas que notepad ++ no admite con regex antes de la versión 6.x (tanto como me encanta notepad ++).

Ian Pugsley
fuente
1
Notepad ++ admite PCRE completo a partir de la versión 6.
Bob
4

Parece que puedes usar expresiones regulares con FINDSTR

findstr [Windows CMD] :

findstr permite buscar texto (como se especifica con el patrón en el archivo nombre-archivo. Si el nombre del archivo contiene comodines (* o?), busca en todos los archivos que coincidan. La opción / S busca en el directorio actual, así como en sus subdirectorios.   Si el patrón contiene espacios, debe especificarse como so / C: "algún texto para buscar".   Para convertir un patrón en una expresión regular, se debe usar la opción / R.   La opción / I busca mayúsculas y minúsculas.

De la ayuda de FindStr ( Findstr /? ):

/ R - Utiliza cadenas de búsqueda como expresiones regulares.

Regular expression quick reference:
  .        Wildcard: any character
  *        Repeat: zero or more occurrences of previous character or class
  ^        Line position: beginning of line
  $        Line position: end of line
  [class]  Character class: any one character in set
  [^class] Inverse class: any one character not in set
  [x-y]    Range: any characters within the specified range
  \x       Escape: literal use of metacharacter x
  \<xyz    Word position: beginning of word
  xyz\>    Word position: end of word
p0rkjello
fuente
Gracias por su respuesta, pero esta no fue mi pregunta.
Aziz
2
findstr no se puede reemplazar el texto en los archivos!
Kenny Evitt
4

He encontrado fnr.exe para eso. Tiene GUI y línea de comandos.

Una herramienta de código abierto para encontrar y reemplazar texto en varios archivos.

Caracteristicas

  • Descarga de un solo archivo - fnr.exe (127kb)
  • Reemplace el texto en varios archivos utilizando la aplicación de Windows o mediante la línea de comandos
  • Buscar Sólo para ver dónde se encuentran las coincidencias
  • Búsqueda sensible a mayúsculas
  • Buscando archivos en un directorio o recurriendo a subdirectorios
  • Expresiones regulares
  • Buscar y reemplazar texto de varias líneas
  • Generar botón de línea de comando para crear texto de línea de comando para poner en archivo por lotes
  • Ayuda de linea de comando
  • Pruebas unitarias de buscar / reemplazar motor

Ver opciones de línea de comandos

enter image description here

Sergius
fuente
1
Bastante bien: puede consultar su declaración de "búsqueda" en la GUI, haga clic en "Gen Reemplazar línea de comandos" y prepárese para usar la llamada de la línea de comandos. No es necesario dedicar tiempo a familiarizarse con la sintaxis de la línea de comandos.
sarh
No pude lograr que esto saliera después de hacer los cambios. Tengo que presionar Intro para cerrar, lo que no es especialmente útil para las secuencias de comandos
G-.
@SOL-. No hay espera para & lt; enter & gt; si se ejecuta desde un archivo por lotes.
Sergius
No pude encontrar una forma de generar un nombre de archivo / extensión diferente
Rick
4

Llego un poco tarde a la fiesta, pero JREPL.BAT es una utilidad regex basada en scripts de JScript / batch que se ejecuta de forma nativa en cualquier máquina Windows desde XP en adelante.

La documentación completa está integrada en el script, al que se puede acceder a través de JREPL /?, o usar JREPL /?? para salida paginada.

JREPL utiliza expresiones regulares de ECMA que vienen con JScript. La expresión regular de ECMA no es tan poderosa como la expresión regular .NET disponible para powershell, pero sigue siendo bastante buena. Y creo que el usuario promedio encontrará esta utilidad más fácil de usar que powershell.

Las opciones integradas de JREPL ya proporcionan una gran cantidad de poder inherente, pero la capacidad de inyectar JScript proporcionado por el usuario realmente abre posibilidades increíbles.

Desarrollé el script porque mi lugar de trabajo no permite la descarga de archivos exe no estándar, pero no tiene ninguna restricción para escribir scripts por lotes o JScript :-)

Simplemente siga el enlace y copie el código del script en un archivo llamado JREPL.BAT. Lea las publicaciones posteriores de ese hilo para ver ejemplos de uso e historial de desarrollo. También hay muchas respuestas de StackOverflow que usan JREPL.BAT.

dbenham
fuente
3

Dos buenas opciones son Cygwin lo que le dará un entorno similar a bash similar a Unix (alternativa a cmd.exe); y Unxutils , Puertos Win32 de una colección de utilidades Unix individuales. En cualquiera de los paquetes, vea 'sed', 'awk' y 'grep'.

JRobert
fuente
2
Unxutils es viejo. ahora la cosa es gnuwin32
barlop
Gracias Robert por tu sugerencia. Lamento no haberlo entendido, pero ahora puedo ver que SED era la cosa.
Aziz
@barlop a partir de 2018, gnuwin32 ahora también es viejo .. ¡cygwin está más actualizado!
barlop
0

También puedes usar GSAR para realizar búsqueda de línea de comandos y reemplazar. Funciona con hex y binario también. No hará el trabajo pesado complejo que regex puede realizar, pero para la búsqueda y reemplazo básicos, hace el trabajo rápida y fácilmente.

Sun
fuente