2011-12-01 31 views
5

Questo è il comando che sto usando su una pagina web standard. Vedo da online.unix tr find e replace

tr '<' '\n<' < index.html 

tuttavia dandomi a capo, ma non aggiungendo la carota nuovamente. ad es.

echo "<hello><world>" | tr '<' '\n<' 

rendimenti

(blank line which is fine) 
hello> 
world> 

invece di

(blank line or not) 
<hello> 
<world> 

Grazie

risposta

12

Questo perché tr solo fa carattere per carattere la sostituzione (o cancellazione).

Prova sed invece.

echo '<hello><world>' | sed -e 's/</\n&/g' 

Oppure awk.

echo '<hello><world>' | awk '{gsub(/</,"\n<",$0)}1' 

Or perl.

echo '<hello><world>' | perl -pe 's/</\n</g' 

oppure ruby.

echo '<hello><world>' | ruby -pe '$_.gsub!(/</,"\n<")' 

oppure python.

echo '<hello><world>' \ 
| python -c 'for l in __import__("fileinput").input():print l.replace("<","\n<")' 
+0

ho provato ma ho n n .Non so quale sia il carattere newline sed – Kamran224

+0

@ Kamran224 Funziona per me, ma prova: echo -e ' ' | sed -e 's/

+0

@ Kamran224 '\ n' è un'estensione GNU sed. Su quale sistema stai? – ephemient

1

Funziona per voi?

awk -F"><" -v OFS=">\n<" '{print $1,$2}' 

[jaypal:~/Temp] echo "<hello><world>" | awk -F"><" -v OFS=">\n<" '{$1=$1}1'; 
<hello> 
<world> 

si può mettere un regex// (linee che si vuole che questo accada per) davanti dell'azione awk{}.

+1

''{$ 1 = $ 1} 1'' è più breve e funzionerà se c'è più di'><'su una riga. – ephemient

+0

Grazie a @ephemient Sono d'accordo, ho aggiornato la mia risposta. –

+0

Questo sostituirà meno dei caratteri '<' che nella domanda. –

1

Se avete GNU grep, questo può funzionare per voi:

grep -Po '<.*?>[^<]*' index.html 

che dovrebbe passare attraverso tutto il codice HTML, ma ogni tag dovrebbe cominciare all'inizio della riga con eventuale testo non tag seguente sulla stessa linea.

Se si desidera altro che tag:

grep -Po '<.*?>' index.html 

Si deve sapere, tuttavia, che è not a good idea per analizzare HTML con regex.

1

L'ordine di dove si inserisce la nuova linea è importante. Inoltre puoi sfuggire allo "<".

tr '\/<' '\/<\n' < index.html

`tr '<' '<\n' < index.html` works as well.