Backreferences en Vim.

Supongamos que tengo un texto tipo


<option value="10">Cáceres</option>
<option value="11">Cádiz</option>
<option value="39">Cantabria</option>
<option value="51">Ceuta</option>

y quiero convertirlo en


<option value="10" id="10" >Cáceres</option>
<option value="11" id="11" >Cádiz</option>
<option value="39" id="39" >Cantabria</option>
<option value="51" id="51" >Ceuta</option>

usando una busqueda y reemplazamiento de vim. Me ahorraria mucho trabajo.

La expresion regular a buscar (el value=”xx”) es sencilla:

/value=”\d\d”

Pero hay que sustituirlo por una cadena que incluya esos dos digitos que no conocemos! hay una forma de guardar esos “dos digitos” (o lo que sea) y referenciarlo en la sustitucion.

Todo lo que se meta entre \( y \) se convierte en un backreference.

Asi que si buscamos /value=”\(\d\d\)” y lo sustituimos por /value=”\1″ id=”\1″, fuciona.

:%s/value=”\(\d\d\)”/value=”\1″ id=”\1″/g

El backreference es \1 porque es el primero defindo con \(algo\). El siguiente seria \2, etc

Y con esta tonteria en vim, me ahorro teclear los identificadores de 50 provincias. Claro que si fueran 25mil, me gustari a mi ver a alguien con el word o el notepad 😛

🙂