如何使用sed在匹配模式之前插入一行

时间:2011-07-19 09:55:57

标签: bash

我正在处理一些HTML代码而且我遇到了一些问题。这是一些代码的摘录,格式完全相同

                                                        <tr>
                          <td nowrap valign="top" class="table_1row"><a name="d071301" id="d071301"></a>13-Jul-2011</td>
                          <td width="21%" valign="top" class="table_1row"><a href="http://www.info.htm" target="_blank">LCQ8: Personal data of job</a></td>

这里我必须与

相匹配
                                                    <tr>
                      <td nowrap valign="top"

并在<tr>之前插入一些内容。出现问题,因为我必须匹配不同行中的模式。 我试过了

grep -c "<tr>\n<td nowrap valign="top"" test.html
grep -c "<tr>\n*<td nowrap valign="top"" test.html
grep -c "<tr>*<td nowrap valign="top"" test.html

测试,但没有一个工作。所以我有两个维度来找出问题:

  
      
  1. 匹配<td nowrap valign="top" and insert in the line above
  2.   
  3. 匹配整个字符串
  4.   
                                                <tr>
                  <td nowrap valign="top"

有人会建议采用两种方式吗?

2 个答案:

答案 0 :(得分:2)

使用sed可以在多行上进行替换。它也很容易替代比赛。

sed  "/\s*<tr>\s*/ { N; s/.*<tr>\n\s*<td.*/insertion\n&/ }" 

这条神秘的线条基本上说:

  1. 与(/\s*<tr>\s*/
  2. 匹配一行
  3. 继续下一行(N
  4. 用匹配的模式替换插入和匹配的字符串,其中&amp;表示匹配的字符串(s/.*<tr>\n\s*td.*/insertion\n&/
  5. Sed执行替换非常强大,它是一个很好的工具。如果您想了解有关sed的更多信息,请参阅本手册: http://www.grymoire.com/Unix/Sed.html

答案 1 :(得分:0)

  1. 试试grep -P "tr>\s*\n\s*<td"
  2. 目前尚不清楚它如何帮助您在<tr>之前插入内容,但无论如何。
  3. 引用字符串不嵌套,您需要转义引号字符,或使用单引号而不是双引号。