2009-03-07 15 views
5

¿Alguien sabe si es posible concatenar coincidencias resultantes de una búsqueda en un solo registro? Por ejemplo, que tiene un archivo con los contenidos siguientes:Copie el texto correspondiente para registrar

aaa :xxx 123 
bb :y 8 
ccccc :zzzzz 1923 

Ahora lo que quiero es copiar la columna que empiezan con ':' en otro lugar. Desafortunadamente no puedo usar el modo de bloque visual, porque la primera columna no ha fijado el ancho. Pensé que podría buscar la segunda columna (: \ w +) y almacenar los maches en un registro.

Respuesta

8

Otra forma:

:g/:/norm f:"Aye 

por :h quote_alpha, si se utiliza un nombre de registro en mayúsculas, añade más que reemplaza el contenido de la caja registradora. Si ejecuta este y comprobar el contenido del registro "a, verá

:xxx:y:zzzzz 

(Posiblemente con saltos de línea, dependiendo de cómo se tiene cpoptions conjunto.)

+0

Realmente muy bonita. –

0

Primero comenzaría con el análisis del archivo. Para este uso TextFieldReader en lugar de inventar su propio analizador CSV:

using Microsoft.VisualBasic.FileIO; 

TextFieldParser reader = new TextFieldReader("C:\MyFile.txt"); 
reader.Delimiters = new string[] { " " }; 
string[] currentRow = null; 
while (!reader.EndOfData) 
{ 
    try 
    { 
     currentRow = reader.ReadFields(); 
     foreach(string field in currentRow) 
     { 
      //save this field... 
     } 
    } 
    catch (MalformedLineException ex) 
    { 
     //handle exception the way you want 
    } 
} 

Una vez que tengo los datos me gustaría extraer sólo la columna que estoy interesado en si se puede asumir que cada línea tiene el mismo patrón entonces usted puede. Determine la columna derecha durante el análisis de la primera fila y luego, al analizar el resto de las filas, puede guardar la columna correspondiente. No tiene que guardar todo el archivo en la memoria.

EDIT: Lo siento terriblemente, pensé que la pregunta era sobre la programación C#. Mi error, lo siento

+3

mundo no se acaba en Micro $ oft tecnologías ;-) ;-) ;-) – kyku

+0

@MykolaGolubyev Ni siquiera está mal: simplemente no es una respuesta. :) –

2

Se podría hacer una macro:

qa (hacer una macro y almacenarlo en un registro).

"Rye (tirón hasta el final de la palabra y añadirlo al registro R - medios de capital anexan, sobreescritura en minúscula).

n (un partido)

q (fin de la grabación)

Si hay 10 partidos, hacer 10 @ un Asegúrese de que el registro r está vacía cuando se empieza.

+0

olvidó agregar /: \ w + en el algoritmo begin. –

1

Agregue esto a su .vimrc o crear cualquier archivo en la carpeta vim plugin con el siguiente contenido.
Después de ejecutar estas líneas a través de .vimrc o plugin, use el comando: CopyTextAfterColon y luego simplemente inserte el texto del buffer del sistema que necesite.

function! s:copy_after_colon() 
    let values = '' 

    let pattern = '^.*:\(\w\+\).*$' 

    for line_number in range(1, line('$')) 
     let line = getline(line_number) 
     if line =~ pattern 
      let value = substitute(line, pattern, '\1', '') 
      let values .= value."\n" 
     endif 
    endfor 

    let @* = values 
endfunction 

command! -nargs=0 CopyTextAfterColon call <SID>copy_after_colon() 

Puede adaptar esto más tarde para diferentes propósitos.

Cuestiones relacionadas