
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] foobar
obtiene 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')/