2012-10-04 25 views
9

Ho un file con le righe che contengono:Rimuovere/sostituire tag html in bash

<li><b> Some Text:</b> More Text </li> 

Voglio rimuovere i tag HTML e sostituire il tag </b> con un trattino così diventa in questo modo:

Alcuni testi: - Altro testo

Sto tentando di utilizzare sed tuttavia non riesco a trovare la combinazione di espressioni regolari corretta.

risposta

14

Se strettamente desidera mettere a nudo tutti i tag HTML, ma allo stesso tempo solo sostituire il tag </b> con una -, è possibile concatenare due semplici sed comandi con un tubo:

cat your_file | sed 's|</b>|-|g' | sed 's|<[^>]*>||g' > stripped_file 

Questa volontà passare tutti i contenuti del file al primo comando sed che gestirà la sostituzione di </b> in un -. Quindi, l'output di questo verrà inviato a un sed che sostituirà tutti i tag HTML con stringhe vuote. L'output finale verrà salvato nel nuovo file stripped_file.

Utilizzando un metodo simile come l'altra risposta da @Steve, si potrebbe anche usare sed s' -e opzione per le espressioni a catena in un unico (comando non pipe); con l'aggiunta di -i, si può anche leggere-in e sostituire il contenuto del file originale senza la necessità di cat, o un nuovo file:

sed -i -e 's|</b>|-|g' -e 's|<[^>]*>||g' your_file 

Questo farà la sostituzione proprio come il comando incatenato sopra, tuttavia questa volta sostituirà direttamente i contenuti nel file di input. Per salvare in un nuovo file, rimuovere lo -i e aggiungere > stripped_file alla fine (o qualunque nome di file si scelga).

+0

Questo mi ha aiutato a risolvere alcuni file XML con '= "x"' tipo di testo variabile . Usato 's/'variable ="' [^ \ "] * \" // 'per abbinare il nome del tag e tutto tra le due virgolette successive. (Ignora il mix funky delle virgolette doppie con escape e escape) – cde

+0

Recommending' cat | Sed | sed' e poi menzionando di passaggio che in realtà tutto ciò di cui hai bisogno è "sed" sembra mal diretto. "Potresti anche" non raccomandare l'approccio sbagliato ". – tripleee

0

Un modo utilizzando GNU sed:

sed -e 's/<\/b>/-/g' -e 's/<[^>]*>//g' file.txt 

Esempio:

echo "<li><b> Some Text:</b> More Text </li>" | sed -e 's/<\/b>/-/g' -e 's/<[^>]*>//g' 

Risultato:

Some Text:- More Text