¿Reemplazar una expresión regular dentro de vim con una salida producida por un comando de consola con la expresión como argumento?

¿Reemplazar una expresión regular dentro de vim con una salida producida por un comando de consola con la expresión como argumento?

digamos que tengo un archivo con el siguiente contenido:

Este es un _archivo_ que tiene algunas palabras clave _especiales_ que _me gustaría_ reemplazar.

Puedo hacer una búsqueda y reemplazar las palabras clave especiales con "%s/_*_/algo", pero me gustaría que "algo" sea el resultado de un comando externo. ¿Es esto posible en vim o necesito activarlo?

Respuesta1

Sí tu puedes. Ver :help sub-replace-special; Le permite \=reemplazar con una expresión de Vim. Y system()puede ejecutar un comando externo y devolver su salida. Vea mi ejemplo trivial con hostname. Tenga en cuenta que tuve que usar substitute()para deshacerme de los caracteres de nueva línea finales en la salida.

:%s/_[^_]*_/\=substitute(system('hostname'),'\n','','g')/g

PD: También corregí tu patrón de expresión regular para que coincida con tu ejemplo.

Respuesta2

En la respuesta de Ingos, que me ayudó mucho, no veo cómo hacer referencia a un subpatrón de la coincidencia y usarlo como argumento para el comando de shell ("producido por un comando de consola con la expresión como argumento").

En mi caso tenía líneas de registro de la siguiente forma: [<unix timestamp>] <message>, es decir [1406844000] foobar. Quería anteponerles la hora en un formato legible por humanos.

El siguiente comando vim coincide con la marca de tiempo (subcoincidencia 1) y el mensaje (el resto, subcoincidencia 2) y antepone la cadena de tiempo del comando de fecha:

:% s/^\[\(\d\+\)\] \(.*\)$/\=substitute(system('date -d @'.submatch(1)),'\n', '', 'g').': ['.submatch(1).'] '.submatch(2)/

[1406844000] foobarobtiene Fr 1. Aug 00:00:00 CEST 2014: [1406844000] foobar.

HT

Respuesta3

Para sustitución de base64 en un archivo ldiff:

:%s/:: \(.*\)$/\=substitute(': ' . system('echo '.submatch(1).'|base64 -d'),'\n','','g')/

información relacionada