2012-08-28 60 views
3

我需要一些Sed的幫助。我在Windows和Mac OSX上使用它。我需要桑達添加每4行在模式之間每四行添加兩行 - SED

</tr> 
<tr> 

,找到的第一個<tr>後,停止做它</tr>

我無法找到一個方法來這樣做。 每個文件最多將有20桌,所以我需要自動做...

從這個

<div class="titulo"> TERMINAL CAPAO DA IMBUIA</div> 
<div class="dataedia"> 
Válido a partir de: 30/07/2012 - 
DIA ÚTIL</div> 
<table> 
<tr> 
<td>05:50</td> 
<td>05:58</td> 
<td>06:04</td> 
<td>06:08</td> 
<td>06:12</td> 
<td>06:15</td> 
<td>06:17</td> 
<td>06:20</td> 
<td>06:22</td> 
<td>06:25</td> 
<td>06:27</td> 
<td>06:30</td> 
<td>06:32</td> 
<td>06:35</td> 
<td>06:37</td> 
<td>06:39</td> 
<td>06:42</td> 
<td>06:44</td> 
<td>06:47</td> 
<td>06:49</td> 
<td>06:52</td> 
<td>06:54</td> 
<td>06:57</td> 
<td>06:59</td> 
<td>07:01</td> 
<td>07:04</td> 
<td>07:06</td> 
<td>07:09</td> 
<td>07:11</td> 
<td>07:14</td> 
<td>07:16</td> 
<td>07:18</td> 
<td>07:21</td> 
<td>07:23</td> 
<td>07:26</td> 
<td>07:28</td> 
<td>07:31</td> 
<td>07:33</td> 
<td>07:36</td> 
<td>07:38</td> 
</tr> 
</table> 
</div> 

更改爲此

<div class="titulo"> TERMINAL CAPAO DA IMBUIA</div> 
<div class="dataedia"> 
Válido a partir de: 30/07/2012 - 
DIA ÚTIL</div> 
<table> 
<tr> 
<td>05:50</td> 
<td>05:58</td> 
<td>06:04</td> 
<td>06:08</td> 
</tr> 
<tr> 
<td>06:12</td> 
<td>06:15</td> 
<td>06:17</td> 
<td>06:20</td> 
</tr> 
<tr> 
<td>06:22</td> 
<td>06:25</td> 
<td>06:27</td> 
<td>06:30</td> 
</tr> 
<tr> 
<td>06:32</td> 
<td>06:35</td> 
<td>06:37</td> 
<td>06:39</td> 
</tr> 
<tr> 
<td>06:42</td> 
<td>06:44</td> 
<td>06:47</td> 
<td>06:49</td> 
</tr> 
<tr> 
<td>06:52</td> 
<td>06:54</td> 
<td>06:57</td> 
<td>06:59</td> 
</tr> 
<tr> 
<td>07:01</td> 
<td>07:04</td> 
<td>07:06</td> 
<td>07:09</td> 
</tr> 
<tr> 
<td>07:11</td> 
<td>07:14</td> 
<td>07:16</td> 
<td>07:18</td> 
</tr> 
<tr> 
<td>07:21</td> 
<td>07:23</td> 
<td>07:26</td> 
<td>07:28</td> 
</tr> 
<tr> 
<td>07:31</td> 
<td>07:33</td> 
<td>07:36</td> 
<td>07:38</td> 
</tr> 
</table> 
</div> 

是否有可能與sed?如果不是,我應該使用什麼工具?

感謝

回答

3

我不喜歡使用sed處理HTML代碼的想法。說,試圖用這樣的:

內容的 script.sed

## For every line between '<tr>' and '</tr>' do ... 
/<tr>/,/<\/tr>/ { 

    ## Omit range edges. 
    /<\/\?tr>/ b; 

    ## Append '<td>...</td>' to Hold Space (HS). 
    H; 

    ## Get HS to Pattern Space (PS) to work with it. 
    x; 

    ## If there are at least four newline characters means that exists four 
    ## '<td>' tags too, so add a '<tr>' before them and a '</tr>' after them, 
    ## print, and delete them (already processed). 
    /\(\n[^\n]*\)\{4\}/ { 
     s/^\(\n\)/<tr>\1/; 
     s/$/\n<\/tr>/; 
     p 
     s/^.*$//; 
    } 

    ## Save the '<td>'s to HS again and read next line. 
    x; 
    b; 
} 

## Print all lines out of the range. 
p; 

假設infile與張貼在問題的數據,運行像腳本:

sed -nf script.sed infile 

國債收益率:

<div class="titulo"> TERMINAL CAPAO DA IMBUIA</div> 
<div class="dataedia"> 
Válido a partir de: 30/07/2012 - 
DIA ÚTIL</div> 
<table> 
<tr> 
<td>05:50</td> 
<td>05:58</td> 
<td>06:04</td> 
<td>06:08</td> 
</tr> 
<tr> 
<td>06:12</td> 
<td>06:15</td> 
<td>06:17</td> 
<td>06:20</td> 
</tr> 
<tr> 
<td>06:22</td> 
<td>06:25</td> 
<td>06:27</td> 
<td>06:30</td> 
</tr> 
<tr> 
<td>06:32</td> 
<td>06:35</td> 
<td>06:37</td> 
<td>06:39</td> 
</tr> 
<tr> 
<td>06:42</td> 
<td>06:44</td> 
<td>06:47</td> 
<td>06:49</td> 
</tr> 
<tr> 
<td>06:52</td> 
<td>06:54</td> 
<td>06:57</td> 
<td>06:59</td> 
</tr> 
<tr> 
<td>07:01</td> 
<td>07:04</td> 
<td>07:06</td> 
<td>07:09</td> 
</tr> 
<tr> 
<td>07:11</td> 
<td>07:14</td> 
<td>07:16</td> 
<td>07:18</td> 
</tr> 
<tr> 
<td>07:21</td> 
<td>07:23</td> 
<td>07:26</td> 
<td>07:28</td> 
</tr> 
<tr> 
<td>07:31</td> 
<td>07:33</td> 
<td>07:36</td> 
<td>07:38</td> 
</tr> 
</table> 
</div> 
+0

這工作完美。謝謝! – ghaschel

+0

這不會工作,如果我有一個小文件...任何方式來使其忽略它,或使其搜索

,而不是和? – ghaschel

1

嘗試awk

awk '{print}; /<td>/ && ++i==4 {print "</tr>\n<tr>"; i=0}' file 
  • 打印行
  • 如果它是一個<td>再增加i
  • 如果i4打印</tr><tr>和復位i

與給定的輸入返回測試所需的輸出, ,唯一的「問題」是一個額外的<tr></tr>出現在列表的末尾。 這是可以修復的,但我在這裏耗盡時間。 當我回來時,如果您認爲需要,我可以查看它。

...結果文件的結尾部分

<td>07:26</td> 
<td>07:28</td> 
</tr> 
<tr> 
<td>07:31</td> 
<td>07:33</td> 
<td>07:36</td> 
<td>07:38</td> 
</tr> 
<tr>    <-- extra <tr></tr> here 
</tr> 
</table> 
+0

我馬上去awk的...謝謝你的幫助^^ – ghaschel

1

你可以試試正則表達式。您可以測試下對錶達: http://gskinner.com/RegExr/

抓表達:

?</td>.<td>.*?</td>.<td>.*?</td>.<td>.*?</td>)(?!.</tr>) 

替換表達:

$1\n</tr>\n<tr> 

標誌檢查:

global, ignorecase, dotall 

結果:

<table> 
<tr> 
<td>05:50</td> 
<td>05:58</td> 
<td>06:04</td> 
<td>06:08</td> 
</tr> 
<tr> 
<td>06:12</td> 
<td>06:15</td> 
<td>06:17</td> 
<td>06:20</td> 
</tr> 
<tr> 
<td>06:22</td> 
<td>06:25</td> 
<td>06:27</td> 
<td>06:30</td> 
</tr> 
<tr> 
<td>06:32</td> 
<td>06:35</td> 
<td>06:37</td> 
<td>06:39</td> 
</tr> 
<tr> 
<td>06:42</td> 
<td>06:44</td> 
<td>06:47</td> 
<td>06:49</td> 
</tr> 
<tr> 
<td>06:52</td> 
<td>06:54</td> 
<td>06:57</td> 
<td>06:59</td> 
</tr> 
<tr> 
<td>07:01</td> 
<td>07:04</td> 
<td>07:06</td> 
<td>07:09</td> 
</tr> 
<tr> 
<td>07:11</td> 
<td>07:14</td> 
<td>07:16</td> 
<td>07:18</td> 
</tr> 
<tr> 
<td>07:21</td> 
<td>07:23</td> 
<td>07:26</td> 
<td>07:28</td> 
</tr> 
<tr> 
<td>07:31</td> 
<td>07:33</td> 
<td>07:36</td> 
<td>07:38</td> 
</tr> 
</table> 
</div> 

您可以使用像Notepad ++這樣的編輯器一次批量替換多個文件(語法會有所不同)。

1

Perl的解決方案,仍然使用正則表達式,而不是解析HTML:

perl -pe ' 
    undef $inside if m{</tr>}; 
    if ($inside and ($. % 4) == $tr_line) { 
     print "</tr>\n<tr>\n"; 
    } 
    $inside = 1 if defined $tr_line; 
    $tr_line = ($. + 1) % 4 if /<tr>/; 
    ' file 
1
sed '\!<td>!,\!</table!{N;N;N;i\ 
</tr>\ 
<tr> 
}' input_file 
0

使用xsh

open :F html file ;             # Open as html. 
while //table/tr[count(td)>4] wrap :U position()=8 tr //table/tr/td ; # Wrap four td's into a tr. 
xmove :r //table/tr/tr before .. ;         # Unwrap the extra tr. 
remove //table/tr[last()] ;           # Remove the extra tr. 
相關問題