2013-07-23 47 views
1

我試着寫一個shell紙條以下數據shell腳本轉換成單一基於參數多行

輸入文件page.txt與內容:

enter a first page title<br><div style="margin-left: 40px;">enter a first point <br></div><div style="margin-left: 80px;">enter a second point<br></div><div style="margin-left: 120px;">enter a third point<br></div><div style="margin-left: 80px;"><br></div><div style="margin-left: 40px;"><br></div><div style="margin-left: 40px;"><br></div> 

算法:

Read the pages file 
Replace <br> with newline 
Replace <div style="margin-left: 40px;"> with 1 tab 
Replace <div style="margin-left: 80px;"> with 2 tab 
Replace <div style="margin-left: 120px;"> with 3 tab 
Replace <div style="margin-left: 160px;"> with 4 tab 

我想用這個

tr '<br>' '\n' < page.txt 

預期輸出文件

enter a first page title 
    enter a first point 
     enter a second point 
      enter a third point 

請告訴告訴如何編寫上述腳本..

+2

'tr'剛剛替換字符,它不能做你想什麼。使用sed,就像'sed's/
/\ n/g''那樣。 – ahilsend

+0

它必須是一個shell腳本?我們不能使用python或perl嗎? –

+0

Shell腳本通常不太適合這種問題,你的限制究竟是什麼?僅限Bash或可以在命令行上運行的任何東西?你有任何保證不會有任何嵌套的div?文件是否總是嚴格遵守上述格式(例如,「margin-left」和像素數量之間始終有一個空格,總是像素數目相同,等等)?字符串解析如果您不完全控制格式或使用實際的DOM,則HTML非常容易出錯。 – Thor84no

回答

0

最簡單的是更換線路(不\n結束,但對結束行)與<br>,像這樣:

(echo line one; echo line two) | sed -e 's/$/<br>/' 

或在您的情況:

sed -e 's/$/<br>/' < inputfile 

替換行開始處的製表符的操作同樣使用插入符號作爲行首行標記。作爲一個完整的腳本:

TAB="$(echo -e "\t")" 
sed -e "s/^$TAB$TAB$TAB$TAB\(.*\)/<div style=\"margin-left: 160px;\">\1<\/div>/ \ 
    -e "s/^$TAB$TAB$TAB\(.*\)/<div style=\"margin-left: 120px;\">\1<\/div>/ \ 
    -e "s/^$TAB$TAB\(.*\)/<div style=\"margin-left: 80px;\">\1<\/div>/ \ 
    -e "s/^$TAB\(.*\)/<div style=\"margin-left: 40px;\">\1<\/div>/ \ 
    -e 's/$/<br>/' \ 
    <inputfile> outputfile 

注1:\在端裝置續行,因此,上述2個語句。注意2:我假設你還想在行末加上</div>,並且只顯示/的轉義</div>

請注意,對於任何更復雜的事情,您應該考慮使用正確的提取和正則表達式語言,如Perl。你可能會想要做一些像在一個<div>中以同樣方式縮進一組的方式進行組合的行。

1

我不喜歡來處理XML標籤沒有一個分析器,但在這種特殊情況下你的數據似乎不可思議吧(壞的形成),所以並評估在替換命令替換字符串的選擇是一個很好的工具爲解決方案。

我用三個替代的命令,第一個替換所有<br>用換行,第二個要刪除所有密切div標籤,而第三個尋求開放div標籤,提取屬性和使用的數量它計算出有多少標籤插入:

perl -pe ' 
    s/<br>/\n/g; 
    s{</div>}{}g; 
    s{\Q<div style="margin-left: \E(\d+)\s*\Qpx;">}{"\t" x ($1/40)}ge 
' infile 

它產生:

enter a first page title 
    enter a first point 
     enter a second point 
      enter a third point