2011-09-18 23 views
11

Mis datos es de la forma:Cómo borrar texto después de un símbolo especificado en Vim

id|name|things that I don't care 

Así que para cada línea Quiero borrar texto después del segundo símbolo |.

¿Cómo hago esto en Vim con un comando?

Editar:

En realidad, hay tuberías adicionales después de la segunda |, ya que el | se utiliza como delimitador de columnas.

Respuesta

18

Una solución:

:%s!^\([^|]*|\)\{2\}\zs.*!! 

Explicación:

  • %: en cada línea
  • s: subtitute
  • !: inicio del patrón de
  • ^: inicio de la línea
  • \(: inicio del grupo
  • [^|]*: cualquier número de caracteres no tubulares
  • |: seguido de una tubería
  • \): final del grupo
  • \{2\}: coincide con dos cargos de ese grupo
  • \zs: iniciar el ajuste de patrones aquí
  • .*: cualquier carácter
  • !: fin del patrón y el inicio de la sustitución
  • !: fin de la sustitución

Esto dejará intactas las líneas con menos de dos tuberías y también funcionará con wi las líneas que tienen más que las dos tuberías ...

Antes

id name things that I don't care no pipes 
id|name things that I don't care one pipe 
id|name|things that I don't care two pipes 
id|name|things that I don't care extra pipe at line end| 
id|name|things that I don't care | extra pipe mid-line 
id|name|things that I don't| care| two extra pipes 
name|things that I don't care missing first column and pipe 
|name|things that I don't care missing first column 

Después:

id name things that I don't care no pipes 
id|name things that I don't care one pipe 
id|name| 
id|name| 
id|name| 
id|name| 
name|things that I don't care missing first column and pipe 
|name| 
+1

Gracias por la demostración de '\ zs' –

+0

@Michael Dunn: ¡De nada! – Johnsyweb

+1

¡Explicación muy completa! –

0

Me gustaría hacer algo como:

%s/\(.*|.*|\).*/\1 

Yeap, que trabajó:

yeap

+3

Solo si hay exactamente dos tubos en la línea, porque "las cosas que no me importan" simplemente podrían tener un tubo ... quizás ... nunca se sabe. :) #nitpicking –

1

Si el "no importa" parte no tiene tuberías, entonces

:%s/|[^|]*$/|/ 

que también se ocupa de partes vacías de "no me importa". Y sigue funcionando si agrega nuevos campos antes de la parte "no me importa".

11

Uno simplemente puede repetir un comando de modo normal que salta al siguiente carácter al segundo símbolo | y elimina hasta el final de la línea para cada una de las líneas .

:%norm!2f|lD 
+1

Esto es muy agradable. Mucho mejor [VimGolf] (http://vimgolf.com/) puntuación que mi respuesta también! – Johnsyweb

+1

@Johnsyweb: ¡Gracias! Yo diría que es más natural, ya que sigue el flujo de edición casual simplemente repitiendo los comandos que uno usa para realizar la tarea en una línea. –

0

:%s/[^|]*|[^|]*|\zs.*//

Una variación de lo que ya hemos visto.

Unir muchos "no tubos" seguidos de tubos, dos veces. Reemplace sin nada a partir de la segunda tubería (\ zs).

+0

Esto borra el segundo conducto, no solo el "texto después del segundo" '|' símbolo ". – Johnsyweb

+1

Lo sé. Traté de ser inteligente. Leyendo ese tubo es el separador de columna, pensé que no había necesidad de uno al final ya que no había ninguno al principio. Debería haberlo dicho en el texto sin embargo. – johnny

Cuestiones relacionadas