sed regex rimuove i caratteri speciali


0

Ho un file con più stringhe che provengono da un testo in formato HTML, quindi hanno alcune sequenze HTML che non sembrano buone in un'interfaccia console. Ecco un esempio:

Text1™
[Text®2]
Text:3

La cosa che sto provando è di rimuovere tutto tra & e; quindi il testo è di nuovo leggibile, come il seguente:

Text1
Text2
Text3

In realtà sto cercando di usare sed per rimuovere i caratteri extra:

sed 's#&*;##g' <file>

Il problema è che rimuove solo il; dalle stringhe di testo.

La domanda allora è: come si dovrebbe codificare l'espressione regex per rimuovere la catena extra: & # [1-9] +;

Risposte:


1

La tua regexp

sed 's#&*;##g' <file>

non fa quello che pensi che faccia. Il *personaggio è un moltiplicatore che dice che il carattere precedente viene ripetuto 0 o più volte. Il carattere precedente è &, quindi corrisponderebbe ad esempio &&&;e ;( &è stato scritto 0 volte prima ;! Questo è ciò che corrisponde nei casi di test) ma non quello che vuoi in questo caso.

È necessario specificare " qualsiasi carattere" prima del moltiplicatore, che è rappresentato da un singolo punto, ..

$ echo 'Text&#58;3' | sed 's#&.*;##g'
Text3

Questo è stato il primo problema. Il secondo è il concetto del cosiddetto abbinamento "avido": sedvedrà il primo &e poi proverà ad abbinare la stringa più grande possibile. Se hai più entità HTML su una sola riga, questo sarebbe un problema poiché:

$ echo 'Text&#58;3 and some more text &aring; and end' | sed 's#&.*;##g'
Text and end

Se vuoi vedere una correzione nel sedcontesto, puoi cercare il carattere finale dell'entità abbinando qualsiasi numero di " non ; " prima di una chiusura ;facendo:

$ echo 'Text&#58;3 and some more text &aring; and end' | sed 's#&[^;]*;##g'
Text3 and some more text  and end

Avrai ancora problemi con gli usi legittimi del segno e commerciale ( &) nel testo (beh, &amp;è il vero uso "legittimo", ma il mondo reale non è sempre analizzabile come quello ideale) e si abbina troppo, ma questo spiega perché si sedsta comportando così.


sed 's # & [^;] *; ## g' funziona perfettamente.
Peter,

@Peter: bello sentire! Nota però come ho detto: se hai un singolo randagio &in una linea, lo schema potrebbe cancellare troppo. Se l'input è ben educato, non sarà un problema. In caso contrario: è necessario un maggiore rigore nel modello e rapidamente sedi limiti si manifesterebbero e si preferirebbero altri strumenti.
Daniel Andersson,

0

Non è meglio sostituire i codici con i caratteri effettivi?

echo 'Text1&#8482;
&#91;Text&#174;2&#93;
Text&#58;3' | perl -C -pe 's/&#([^;]*)/chr$1/eg'

Produzione:

Text1™;
[;Text®;2];
Text:;3
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.