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:3' | sed 's#&.*;##g'
Text3
Questo è stato il primo problema. Il secondo è il concetto del cosiddetto abbinamento "avido": sed
vedrà 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:3 and some more text å and end' | sed 's#&.*;##g'
Text and end
Se vuoi vedere una correzione nel sed
contesto, puoi cercare il carattere finale dell'entità abbinando qualsiasi numero di " non ;
" prima di una chiusura ;
facendo:
$ echo 'Text:3 and some more text å 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, &
è il vero uso "legittimo", ma il mondo reale non è sempre analizzabile come quello ideale) e si abbina troppo, ma questo spiega perché si sed
sta comportando così.