2011-12-01 20 views
5

これは、私がオンラインの標準的なWebページで使用しているコマンドです。unix tr検索と置換

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

しかし、それは私に改行を与えますが、再びニンジンを追加しません。例:

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

戻り

(blank line which is fine) 
hello> 
world> 

代わりのtrのみ文字のための文字置換(または削除)しているためだ

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

おかげ

答えて

12

代わりにsedを試してください。

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

またはawkです。

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

またはperlです。

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

またはrubyです。

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

またはpython

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

私はそれを試してみましたが、私はn個のn を取得します。私はsed改行文字が何であるか分かりません – Kamran224

+0

@ Kamran224これは私のために働くが、試してみてください:echo -e ' ' | sed -e '/

+0

@ Kamran224 '\ n'はGNU sed拡張です。あなたはどんなシステムにいますか? – ephemient

1

これは機能しますか?

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

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

あなたはawk{}アクションの前に正規表現/ /(これがために起こるしたい行)を置くことができます。あなたはGNU grepている場合

+1

''{$ 1 = $ 1} 1''はより短く、'><'以上であれば動作します。 – ephemient

+0

ありがとう@ephemient私は同意する、私の答えを更新しました。 –

+0

これは、質問に比べて少ない文字数の '<'文字を置き換えます。 –

1

、これはあなたのために働くことがあります。HTMLのすべてを通過する必要がありますが、各タグは以下の可能性非タグテキストを持つ行の先頭から開始する必要があり

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

同じ行に

あなたがタグに過ぎたくない場合は、次の

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

をあなたはそれが正規表現でHTMLを解析するためにnot a good ideaだと、しかし、知っている必要があります。

1

改行を置く順番は重要です。また、 "<"からエスケープすることもできます。

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

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