¿Cómo puedo repetidamente partido desde A hasta B en VIM?
-
09-09-2019 - |
Pregunta
Tengo que conseguir todo el texto entre <Annotation>
y </Annotation>
, donde se produce una palabra MATCH
. ¿Cómo puedo hacer que en VIM?
<Annotation about="MATCH UNTIL </Annotation> " timestamp="0x000463e92263dd4a" href=" 5raS5maS90ZWh0YXZha29rb2VsbWEvbGFza2FyaS8QyrqPk5L9mAI">
<Label name="las" />
<Label name="_cse_6sbbohxmd_c" />
<AdditionalData attribute="original_url" value="MATCH UNTIL </Annotation> " />
</Annotation>
<Annotation about="NO MATCH" href=" Cjl3aWtpLmhlbHNpbmtpLmZpL2Rpc3BsYXkvbWF0aHN0YXRLdXJzc2l0L0thaWtraStrdXJzc2l0LyoQh_HGoJH9mAI">
<Label name="_cse_6sbbohxmd_c" />
<Label name="courses" />
<Label name="kurssit" />
<AdditionalData attribute="original_url" value="NO MATCH" />
</Annotation>
<Annotation about="MATCH UNTIL </ANNOTATION> " score="1" timestamp="0x000463e90f8eed5c" href="CiZtYXRoc3RhdC5oZWx zaW5raS5maS90ZWh0YXZha29rb2VsbWEvKhDc2rv8kP2YAg">
<Label name="_cse_6sbbohxmd_c" />
<Label name="exercises_without_solutions" />
<Label name="tehtäväkokoelma" />
<AdditionalData attribute="original_url" value="MATCH UNTIL </ANNOTATION>" />
</Annotation>
Solución
Lo hace tiene que hacerse dentro de vim? Podría usted engañar, y abrir una segunda ventana en la que la tubería en algo más / menos que te dice lo que el número de línea para ir a dentro de vim?
- Editar -
Nunca he hecho una multilínea partido / la búsqueda en vi [m]. Sin embargo, para hacer trampa en otra ventana:
perl -n -e 'if ( /<tag/ .. /<\/tag/)' -e '{ print "$.:$_"; }' file.xml | less
mostrará los elementos / bloques para "etiqueta" (o cualquier otro nombre más largo a juego), con los números de línea, en menos, y luego se puede buscar otro texto dentro de cada bloque.
Lo suficientemente cerca?
- Editar -
dentro de "menos", forma de
/MATCH
para buscar las apariciones de igualar. En el margen izquierdo será el número de línea donde esa instancia (dentro del elemento específicas / etiquetas) es.
dentro vi [m], tipo
:n
donde "n" es el número de línea deseado.
Por supuesto, si lo que realmente quería hacer era una especie de búsqueda / tirón / reemplazar, es más complicado. En ese momento, awk / Perl / Ruby (o algo similar que se adapte a sus gustos ... o XSL?) Es realmente la herramienta que debe utilizar para la transformación.
Otros consejos
En primer lugar, un descargo de responsabilidad: Cualquier intento de cortar y XML dados con expresiones regulares es frágil; un verdadero analizador XML haría mejor.
El patrón:
\(<Annotation\(\s*\w\+="[^"]\{-}"\s\{-}\)*>\)\@<=\(\(<\/Annotation\)\@!\_.\)\{-}"MATCH\_.\{-}\(<\/Annotation>\)\@=
Vamos a romper hacia abajo ...
Grupo 1 es <Annotation\(\s*\w\+="[^"]\{-}"\s\{-}\)*>
. Que coincide con la etiqueta inicial del elemento de atributo. Grupo 2, que está incrustado en el Grupo 1, coincide con un atributo y se puede repetir 0 o más veces.
Grupo 2 es \s*\w\+="[^"]\{-}"\s\{-}
. La mayoría de estas piezas se utilizan comúnmente; la más inusual es \{-}
, lo que significa la repetición no expansivo (*?
en las expresiones regulares compatibles con Perl). El partido de espacio en blanco no expansivo al final es importante para el rendimiento; sin ella, Vim tratar todas las formas posibles de dividir el espacio en blanco entre los atributos entre el \s*
al final del Grupo 2 y el \s*
al comienzo de la siguiente aparición del Grupo 2.
Grupo 1 es seguido por \@<=
. Se trata de un ancho de cero positivo aspecto subyacente. Previene la etiqueta de comienzo de ser incluido en el texto coincidente (por ejemplo, para s ///).
Grupo 3 es \(<\/Annotation\)\@!\_.
. Incluye Grupo 4, que coincide con el comienzo de la etiqueta de fin Atributo. El \@!
es un negativo de preanálisis de ancho cero y \_.
coincide con cualquier carácter (incluyendo saltos de línea). Juntos, estos grupos de partidos en cualquier carácter excepto donde comienza la etiqueta final de atributos. Grupo 3 es seguida por un marcador de \{-}
repetición no expansivo para que coincida con el bloque más pequeño de texto antes de igualar. Si se va a utilizar \_.
lugar del Grupo 3, el texto coincidente podría incluir la etiqueta final de un elemento de anotación que hizo no incluyen PARTIDO y seguir a través en el siguiente elemento de anotación con PARTIDO. (Inténtelo.)
El siguiente bit es directo: Buscar el resultado y un número mínimo de otros caracteres antes de la etiqueta final
. Grupo 5 es fácil: Es la etiqueta final. \@=
es un aspecto positivo de la ventaja de ancho cero, que se incluye aquí por la misma razón que la \@<=
para la etiqueta de comienzo. Tenemos que repetir <\/Attribute
lugar de uso \4
porque los grupos con modificadores de ancho cero no son capturados.