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>
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top