sed - 在模式之间每四行添加两行 - SED

标签 sed

我需要一些有关 Sed 的帮助。我在 Windows 和 Mac OSX 上使用它。我需要 Sed 添加一个

</tr>
<tr>

每 4 行,在第一个 <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 是否可行? ?如果没有,我应该使用什么工具?

谢谢

最佳答案

我不喜欢使用 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>

关于sed - 在模式之间每四行添加两行 - SED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12159289/

相关文章:

linux - 简单的 sed 替换

linux - 搜索一个字符串,得到结果后剪切该单词并将结果存储在变量中

linux - 使用 sed/awk 将一行附加到另一行

git - 加速 bash 脚本将 git repo 转换为 LFS

linux - 如何使用sed替换bash中后跟0个或更多空格的命令

bash - 使用Awk或Sed在特定行的末尾添加语句

bash - 如何用另一个文件的第一行替换一个文件的第一行

linux - 使用 'sed' 或 'awk' 进行数据转换任务

shell - 旋转文本文件

python - Paramiko sed 查找和替换不会通过