Grupos de captura de Vim Regex [bau -> byau: ceu -> cyeu]

132

Tengo una lista de palabras:

bau
ceu
diu
fou
gau

Quiero convertir esa lista en:

byau
cyeu
dyiu
fyou
gyau

Intenté sin éxito el comando:

:%s/(\w)(\w\w)/\1y\2/g

Dado que esto no funciona, ¿qué debo cambiar para que los grupos de captura de expresiones regulares funcionen en Vim?

cristiano
fuente
44
Está un poco fuera de tema, así que lo puse aquí como comentario pero ... lo haría :%norm ay<CR>.
romainl
2
En su caso (si es exactamente como se describe), es una opción para: pasar a la segunda columna con l, ingresar al modo Bloque visual con Ctrl+v, marcar la columna completa con Shift+gseguido de l, luego ingresar al modo Insertar con Shift+ie ingresar 'y'. 7 pulsaciones de teclas, incluido el acabado Escpara salir del modo Insertar. No publica como respuesta porque no se trata realmente de grupos de captura (que es lo que busqué cuando encontré esto). :-)
LAFK dice Reinstate Monica

Respuestas:

224

Una forma de solucionar esto es, garantizando el patrón está rodeada por escapado paréntesis:

:%s/\(\w\)\(\w\w\)/\1y\2/g

Ligeramente más corto (y más mágica -al) es utilizar \v, lo que significa que en el patrón después de que todos los caracteres ASCII, excepto '0'-'9', 'a'-'z', 'A'-'Z'y '_'tiene un significado especial:

:%s/\v(\w)(\w\w)/\1y\2/g

Ver:

Johnsyweb
fuente
41

Si no quiere escapar de los grupos de captura con barras invertidas (esto es lo que se ha perdido), preponga \vconvertir el motor de expresión regular de Vim en un modo muy mágico :

:%s/\v(\w)(\w\w)/\1y\2/g
Ingo Karkat
fuente
Ingo, perdón por poner una pregunta en el lugar equivocado: Esto funciona encontrar en :exmode; ¿Hay alguna manera de hacerlo en el cuadro de diálogo Buscar / reemplazar gvim?
JJoao
3
@JJoao: No, el cuadro de buscar / reemplazar es solo para búsqueda y reemplazo literales. No deberías estar usando eso, de todos modos; son solo ruedas de entrenamiento para usuarios de Bloc de notas.
Ingo Karkat
Ingo, gracias (no es para mí: estoy contento con exmode, sino para los lingüistas colaboradores en un proyecto de diccionario): casi funciona, con \v...regexp work find; en la cadena de reemplazo, &funciona pero \ está protegido ( \1\rse pierde)
JJoao
@JJoao: Sí, eso es lo que descubrí mientras jugaba con él también. Todavía estoy escéptico sobre si usar Vim sin el modo Ex es una buena idea, pero podría crear fácilmente su propio diálogo de búsqueda y reemplazo (alimentado internamente :s) a través de inputdialog()y un poco de Vimscript.
Ingo Karkat
Ingo: gracias de nuevo; Estoy de acuerdo con tu opinión escéptica. Inputdialg +: s + vimscript es probablemente la forma en que se construye gvim's find replace. Para mí el \1 \r tratamiento es un error de gvim. Intentaré publicarlo en alguna lista específica de vim. Mientras tanto, intentaré mi único vimscript-inputdialog.
JJoao
34

También puede usar este patrón que es más corto:

:%s/^./&y
  • %s aplica el patrón a todo el archivo.
  • ^. coincide con el primer caracter de la línea.
  • &yagrega el ydespués del patrón.
Juan
fuente
13

También debes escapar de la parálisis de agrupación:

:%s/\(\w\)\(\w\w\)/\1y\2/g

Eso hace el truco.

Henkersmann
fuente