¿Cómo encuentro todas las líneas con más de N apariciones de un personaje usando Vim?

¿Cómo encuentro todas las líneas con más de N apariciones de un personaje usando Vim?

Estoy intentando ubicar todas las líneas en un archivo donde el |carácter (canalización vertical) aparece más de 21 veces. El |carácter es un delimitador de campo, por lo que no hay un número específico de caracteres que puedan estar entre |instancias. ¿Existe una manera fácil de hacer esto en Vim?

NOTA: Estoy usando gVim en una máquina con Windows, por lo que no podré usar ningún truco específico de *nix.

tia

Respuesta1

Puede utilizar una expresión regular para encontrar dichas líneas con la función de búsqueda normal:

/\v(\|[^|]*){21,}

Esto \vgarantiza que la expresión regular funcione independientemente del valor de la magicopción (hace que todos los caracteres no alfanuméricos (excepto el guión bajo) sean especiales; también lo uso aquí para evitar tener que poner barras invertidas antes de (, ), {y }).

Si desea ver todas esas líneas a la vez, puede combinarlas con el :gcomando:

:g/\v(\|[^|]*){21,}/p

Por cierto, este tipo de comando (delexpredecesor devi) es el origen del nombre de la grepherramienta ( g/re/p: re abreviatura de regexp).


Si sus datos de origen están "delimitados por barras verticales", entonces probablemente debería verificar si alguno de los valores tiene caracteres de barra vertical incrustados (tal vez mediante un escape (por ejemplo, con el prefijo de una barra invertida), duplicando o entrecomillando). El método de expresiones regulares anterior se puede ampliar para cubrir la mayoría de los métodos de escape y duplicación, pero el análisis de valores entre comillas generalmente requiere potencia expresiva que la mayoría de los lenguajes de expresiones regulares pueden ofrecer.

información relacionada