2011-11-17 15 views
11

Me gustaría utilizar Vim para que coincida con una expresión regular y realizar una sustitución. Tengo un archivo TSV con las líneas que se parecen a esto:Positiva afirmación y sustitución con Vim?

rs11223-A  -A 
rs23300-G  -TTA 
rs9733-T   -G 
rs11900000-GT -TTG 

deseo de sustituir el guión (-) de caracteres para un ficha sólo en la primera columna después de que los rs ...

En Vim I estaba intentando realizar la sustitución usando:

:%s/(?<=^rs[0-9]{1,12})-/\t/g 

¿Alguien podría indicar cuál es mi problema y una solución correcta?

Respuesta

17

Puede depender de la configuración, pero en mi entorno tengo que anteponer { , } con \.

Además, Vim tiene \zs y \ze para comenzar y finalizar la coincidencia, por lo que generalmente no tiene que lidiar con la apariencia regular de expresiones regulares.

Esto hace lo que quiere:

:%s/^rs\d\{1,12}\zs-/\t/g 
0

desea que el siguiente:

%s/^\(rs[0-9]\{1,12\}\)-/\1\t/g 

Vim expresiones regulares requieren algunas secuencias de escape especiales para {, }, ( y ).

También, en la sección de sustitución, necesita \1 para insertar su cadena coincidente.

7

positivo mirar hacia atrás se realiza mediante:

\@<= 

lo que podría utilizar algo como:

:%s/\d\@<=-/\t/g 

Sus datos reales pueden ser más complejos, pero con lo que usted envió También puede simplemente conformarse para:

:%s/-/\t 

Si rs debería estar al principio de la línea, puede utilizar \zs para especificar el comienzo del partido y el uso de anclaje (^):

:%s/^rs\d*\zs-/\t 
+0

# 2 tendría que ser:% s/rs^\ d \ @<= -/\ t/g – KomodoDave

+0

@KomodoDave: Su el patrón coincidiría con 'rs' al principio de la línea, seguido inmediatamente por un guión (' -') precedido por un * dígito * simple (aspecto positivo detrás de '\ d \ @<= -'). Ninguna de las líneas en los datos dados coincide con ese patrón. Si insiste en anclar, podría usar el patrón que acabo de agregar. –

+0

Pensé que OP significaba columna en el sentido de columnas de caracteres, pero quizás él no. Copié el suyo para editarlo y no lo reemplacé con - como pretendía - lo que quería escribir es::% s/^ rs - \ @<=/\ t/g que coincide con '-' en el primer columna char después de 'rs' al inicio de la línea. – KomodoDave

Cuestiones relacionadas