2011-12-01 14 views
5

To jest polecenie, którego używam na standardowej stronie internetowej, którą przeszukuję w Internecie.unix tr znajdź i zamień

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

jednak daje mi nowe linie, ale nie dodając ponownie marchewki. np.

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

powraca

(blank line which is fine) 
hello> 
world> 

zamiast

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

Dzięki

Odpowiedz

12

to dlatego tr tylko robi znakowych dla znaku podstawienie (lub usunięcie).

Zamiast tego spróbuj sed.

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

Lub awk.

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

Lub perl.

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

Lub ruby.

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

Lub python.

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

Próbowałem to, ale mam n n .Nie wiem, co to jest znak nowej linii sed – Kamran224

+0

@ Kamran224 Działa to dla mnie, ale spróbuj: echo -e ' ' | sed -e 's/

+0

@ Kamran224 '\ n' jest rozszerzeniem GNU sed. W jakim systemie jesteś? – ephemient

1

Czy to działa dla Ciebie?

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

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

Można umieścić regex// (linie chcesz to się stało za) przed działaniem awk{}.

+1

'' {$ 1 = 1 $} 1'' jest krótszy i zadziała, jeśli w linii jest więcej niż '><". – ephemient

+0

Dzięki @ephemient Zgadzam się, zaktualizowałem moją odpowiedź. –

+0

Spowoduje to zastąpienie mniejszej liczby znaków '<'niż w pytaniu. –

1

Jeśli masz GNU grep, to może pracować dla Ciebie:

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

które powinny przechodzić przez wszystkie HTML, ale każdy tag powinien rozpocząć się na początku linii z ewentualnym tekstem non-tag następujący w tej samej linii.

Jeśli chcesz nic poza tagami:

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

Należy jednak wiedzieć, że jest to not a good idea analizować HTML z regexes.

1

Kolejność umieszczania nowej linii jest ważna. Możesz także uciec z "<".

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

`tr '<' '<\n' < index.html` works as well. 
Powiązane problemy