Come posso rendere la mia partita non golosa in vim?


481

Ho un grande file HTML che ha un sacco di markup che assomiglia a questo:

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

Sto cercando di fare un Vim di ricerca e sostituzione di sbarazzarsi di tutto class=""e style="", ma sto avendo difficoltà a fare la partita ungreedy.

Il mio primo tentativo è stato questo

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

ma a Vim non sembra piacere il ?. Sfortunatamente la rimozione del ?match rende la partita troppo golosa.

Come posso rendere la mia partita non gradita?


Penso che la risposta di Paul sia buona. Giusto per dire che "?" non significa facoltativo in vim (se questo è ciò che vuoi ottenere usando "?")
LB40

15
@LB, in molte lingue,. *? significa abbinare qualsiasi personaggio ma essere non avido. Questo è ciò che sta cercando di ottenere.
Randy Morris,

Risposte:


735

Invece di .*usare .\{-}.

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

Vedi anche :help non-greedy


38
Non molto intuitivo, è qualcosa che fa solo Vim?
Ehtesh Choudhury,

95
Ogni cosa ha il suo linguaggio di espressione regolare ... questo è uno dei maggiori problemi con regex.
Patrick Farrell,

35
Molti di questi strumenti sono maturati nello stesso periodo e hanno sviluppato autonomamente il proprio dialetto di un linguaggio di espressioni regolari. Molti di questi strumenti stavano anche provando a risolvere diversi problemi, quindi ha senso che la sintassi potesse essere -potenzialmente selvaggiamente diversa tra queste implementazioni. Dobbiamo accettare che è così che funziona il mondo reale anche se a volte rende le nostre vite più difficili come sviluppatori. Fortunatamente molti strumenti forniscono almeno un'implementazione compatibile con Perl di regex in questi giorni. Sfortunatamente Vim non è uno di questi.
Randy Morris,

15
Se qualcuno come me ha impostato la propria ricerca su \v(bandiera molto magica), vorrai utilizzarlo .{-}.
Jgillman,

48
@Shurane @Ziggy Mnemonic: controlla il numero di ripetizioni come {1,3}fa (parentesi graffe). Il segno meno -significa: ripetere il meno possibile (poco == meno);)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

58

La ricerca non avida in vim viene eseguita utilizzando l'operatore {-}. Come questo:

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

prova:

:help non-greedy

48

Cosa c'è che non va

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

7
Anche se, a mio vantaggio, mi piacerebbe ancora capire meglio la cosa non gradevole.
Mark Biek,

17

Se sei più a tuo agio con la sintassi della regex di PCRE, quale

  1. supporta l'operatore non avido ?, come hai chiesto in OP; e
  2. non richiede operatori di raggruppamento e cardinalità di backwhacking (un requisito di sintassi vim assolutamente controintuitivo poiché non si corrispondono caratteri letterali ma si specificano operatori); e
  3. hai [g] vim compilato con la funzione perl, prova usando

    : ver e ispezionare le caratteristiche; se + perl è lì, sei a posto)

prova a cercare / sostituire usando

:perldo s///

Esempio. Scambia gli attributi src e alt nel tag 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
perldofunziona alla grande, ma sfortunatamente non evidenzia il test selezionato durante la digitazione del regex.
mljrg,

12

Ho scoperto che una buona soluzione a questo tipo di domanda è:

:%! sed ...

(o perl se preferisci). IOW, piuttosto che apprendere le peculiarità regex di vim, usa uno strumento che già conosci. L'uso di perl renderebbe il? modificatore funziona per sbloccare la partita.


2
buon punto, ma essere in grado di /patternverificare che stai abbinando correttamente il modello prima di applicarlo e usare il cmodificatore nella tua espressione regolare vim è anche bello :)
João Portela

questo è corretto. tutte le soluzioni qui non sono vicine al non avido! se devi abbinare [0-9] \ {7} in una riga con molto testo e diverse occorrenze di quel modello, nessuna soluzione qui farà. Le soluzioni qui funzionano solo per cose semplici (che per essere oneste, è ciò che è stato chiesto). ma se stai facendo un po 'di più che cercare fino alla prossima citazione, vim non ti aiuterà.
gcb,

4

Con \v(come suggerito in diversi commenti)

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


-4

Buongiorno,

L'elaborazione regexp di Vim non è troppo brillante. Ho scoperto che la sintassi regexp per sed riguarda la giusta corrispondenza per le capacità di Vim.

Di solito imposto l'evidenziazione della ricerca su (: imposta hlsearch) e quindi gioco con il regexp dopo aver inserito una barra per accedere alla modalità di ricerca.

Modifica: Mark, quel trucco per ridurre al minimo gli abbinamenti avidi è anche trattato nell'eccellente libro "Sed & Awk" di Dale Dougherty ( link Amazon sterilizzato ).

Il capitolo tre "Comprensione della sintassi delle espressioni regolari" è un'introduzione eccellente alle capacità regexp più primitive coinvolte con sed e awk. Solo una breve lettura e altamente raccomandato.

HTH

Saluti,


7
L'elaborazione regex di Vim è in realtà abbastanza buona. Può fare cose che sed non possono fare, come la corrispondenza dei numeri di riga / colonna o la corrispondenza in base alla classificazione per lingua dei caratteri come parole chiave o identificatori o spazi bianchi. Ha anche asserzioni di larghezza zero e la capacità di mettere le espressioni sul lato destro di una sostituzione. Se lo usi \vaiuta a ripulire molto la sintassi.
Brian Carper,

1
@Brian, evviva. Farò un aiuto regex e vedrò cosa mi sono perso.
Rob Wells,

@RobWells, Sed & Awk , che è davvero un ottimo libro imho, non spende esplicitamente parole su quantificatori avidi / pigri. Come prova, non c'è assolutamente nessuna occorrenza delle parole avidità o avidità nel libro, e c'è solo una, ma non correlata, occorrenza della parola pigro .
Enrico Maria De Angelis,

Lo è @EnricoMariaDeAngelis ma l'esempio non si riferisce esplicitamente al termine. Si tratta di come personalizzare il regex per utilizzare l'operatore "non" per ottenere partite non avide. Il termine avido e pigro è arrivato con il motore NFA di Perl quando hanno introdotto gli operatori per modificare in modo specifico il comportamento delle partite avide.
Rob Wells,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.