2009-08-20 7 views
397

Tengo un archivo HTML grande que tiene un montón de marcas que tiene este aspecto:¿Cómo puedo hacer que mi partida no sea codiciosa en vim?

<p class="MsoNormal" style="margin: 0in 0in 0pt;"> 
    <span style="font-size: small; font-family: Times New Roman;">stuff here</span> 
</p> 

que estoy tratando de hacer un Vim de búsqueda y reemplazo para deshacerse de todos class="" y style="" pero estoy teniendo problemas para hacer que el partido sea desagradable.

Mi primer intento fue esta

%s/style=".*?"//g 

pero Vim no parece que les gusta el ?. Desafortunadamente eliminar el ? hace que el partido sea demasiado codicioso.

¿Cómo puedo hacer que mi partida sea desabrida?

+0

creo La respuesta de Pablo es buena. Solo para decir eso "?" no significa opcional en vim (si esto es lo que quiere lograr con "?") – LB40

+11

@LB, en muchos idiomas,. *? significa emparejar cualquier personaje pero no ser codicioso. Eso es lo que él está tratando de lograr. –

Respuesta

608

En lugar de .* uso .\{-}.

%s/style=".\{-}"//g

Además, vea :help non-greedy

+1

Si ': help no-greedy' no funciona, intente': ​​help/\ {- ' –

+21

No es muy intuitivo, ¿es esto algo que solo vim hace? –

+7

Sí. Vim tiene su propio lenguaje de expresiones regulares. –

40

¿Qué hay de malo en

%s/style="[^"]*"//g 
+2

¡Nada! ¡Nada mal! :) –

+3

Aunque, para mi propio beneficio, aún me gustaría entender mejor lo que no tiene importancia. –

+1

@ Mark, acaba de agregar una nota a mi respuesta sobre el excelente capítulo sobre expresiones regulares que cubre esto en el libro "sed & awk" –

9

He encontrado que una buena solución a este tipo de pregunta es:

 
:%!sed ... 

(o Perl, si lo prefiere). IOW, en lugar de aprender las peculiaridades de la expresión regular de vim, utiliza una herramienta que ya conoces. Usando perl haría el? el modificador funciona para desgrejar el partido.

+2

buen punto, pero ser capaz de hacer '/ patrón' para comprobar que está haciendo coincidir el patrón correctamente antes de aplicarlo y usando el modificador 'c' en tu expresión regular vim también es bueno :) –

+0

esto es correcto. ¡todas las soluciones aquí no son cercanas a los no codiciosos! si tiene que hacer coincidir [0-9] \ {7} en una línea con mucho texto y varias ocurrencias de ese patrón, ninguna solución aquí funcionará. Las soluciones aquí solo funcionan para cosas simples (que para ser justos, es lo que se pidió). pero si estás haciendo un poco más que buscar hasta la próxima cita, vim no ayudará. – gcb

-2

día G,

procesamiento de expresiones regulares de Vim no es demasiado brillante. Descubrí que la sintaxis de regexp para sed es la combinación adecuada para las capacidades de vim.

Normalmente establezco el resaltado de búsqueda en (: set hlsearch) y luego juego con la expresión regular después de ingresar una barra inclinada para ingresar al modo de búsqueda.

Editar: Marcos, ese truco para minimizar el juego codicioso está también cubierto por el excelente libro de Dale Dougherty "Sed & Awk" (sanitised Amazon link).

El capítulo tres "Comprensión de la sintaxis de expresiones regulares" es una excelente introducción a las capacidades de expresiones regulares más primitivas involucradas con sed y awk. Solo una breve lectura y muy recomendable.

HTH

aplausos,

+6

El procesamiento de expresiones regulares de Vim es bastante agradable. Puede hacer cosas que sed no puede, como coincidir en números de línea/columna o coincidencias según la clasificación por idioma de los caracteres como palabras clave o identificadores o espacios en blanco. También tiene aserciones de ancho cero y la capacidad de poner expresiones en el lado derecho de un reemplazo. Si usas '\ v', ayuda a limpiar la sintaxis mucho. –

+0

@Brian, aplausos. Haré una ayuda regex y veré qué me he estado perdiendo. –

45

búsqueda no codicioso en vim se hace usando {-} operador.De esta manera:

%s/style=".\{-}"//g 

sólo trato:?

:help non-greedy 
13

Si usted es la sintaxis de expresiones regulares PCRE más cómodo, que

  1. soporta el operador no expansivo, como lo pidió en la OP ; y
  2. no requiere backwhacking agrupación y operadores de cardinalidad (un requisito de sintaxis de vim totalmente contraintuitivo ya que no está coincidiendo con caracteres literales pero especificando operadores); y
  3. que haya [g] vim compilado con la función de Perl, prueba usando

    : ver e inspeccionar características; si + Perl está allí ya está bueno para ir)

búsqueda try/reemplazar el uso de

:perldo s/// 

Ejemplo. atributos src de intercambio y ALT en la etiqueta IMG:

<p class="logo"><a href="/"><img src="/caminoglobal_en/includes/themes/camino/images/header_logo.png" alt=""></a></p> 

:perldo s/(src=".*?")\s+(alt=".*?")/$2 $1/ 

<p class="logo"><a href="/"><img alt="" src="/caminoglobal_en/includes/themes/camino/images/header_logo.png"></a></p> 
1

Con \v (como se sugiere en varios comentarios)

:%s/\v(style|class)\=".{-}"//g 
1

Plugin eregex.vim maneja Perl estilo operadores no codiciosos *? y +?

Cuestiones relacionadas