Sed替换每第n次出现

时间:2011-05-02 14:11:10

标签: sed replace

我正在尝试使用sed替换文件的每个其他html元素,以便我可以制作交替的颜色行。

这是我尝试过的,但它不起作用。

sed 's/<tr valign=top>/<tr valign=top bgcolor='#E0E0E0'>/2' untitled.html

3 个答案:

答案 0 :(得分:11)

我用awk解决它:

awk '/<tr valign=top>/&&v++%2{sub(/<tr valign=top>/, "<tr valign=top bgcolor='#E0E0E0'>")}{print}' untitled.html 

首先,它验证该行是否包含<tr valign=top>

/<tr valign=top>/&&v++%2

以及<tr valign=top>是否是一个奇怪的找到的实例:

v++%2

如果是这样,它将取代行中的<tr valign=top>

{sub(/<tr valign=top>/, "<tr valign=top bgcolor='#E0E0E0'>")}

由于要打印所有行,因此总会执行一个块(对于所有行)并将打印当前行:

{print}

答案 1 :(得分:3)

这对我有用:

sed -e "s/<tr/<TR bgcolor='#E0E0E0'/g;n" simpletable.htm

示例输入:

<table>
  <tr><td>Row1 / col1</td><td>col2</td><td>col3</td></tr>
  <tr><td>Row2 / col1</td><td>col2</td><td>col3</td></tr>
  <tr><td>Row3 / col1</td><td>col2</td><td>col3</td></tr>
  <tr><td>Row4 / col1</td><td>col2</td><td>col3</td></tr>
  <tr><td>Row5 / col1</td><td>col2</td><td>col3</td></tr>
</table>

示例输出:

<table>
  <TR bgcolor='#E0E0E0'><td>Row1 / col1</td><td>col2</td><td>col3</td></tr>
  <tr><td>Row2 / col1</td><td>col2</td><td>col3</td></tr>
  <TR bgcolor='#E0E0E0'><td>Row3 / col1</td><td>col2</td><td>col3</td></tr>
  <tr><td>Row4 / col1</td><td>col2</td><td>col3</td></tr>
  <TR bgcolor='#E0E0E0'><td>Row5 / col1</td><td>col2</td><td>col3</td></tr>
</table>

关键是在sed中使用n命令,该命令前进到下一行。 仅当TR占据不同的行时才有效。 它会破坏嵌套表,或者如果一行中有多个TR。

答案 2 :(得分:0)

根据http://www.linuxquestions.org/questions/programming-9/replace-2nd-occurrence-of-a-string-in-a-file-sed-or-awk-800171/

试试这个。

The current speeed is:
The current speeed is:
The current speeed is:
The current speeed is:
The current speeed is:
The current speeed is:

感叹号否定了从文件开头到第一个&#34; Jack&#34;的所有内容,以便替换对以下所有行进行操作。请注意,我认为这只是一个gnu sed操作。

如果您只需要在第二次出现时进行操作,并忽略任何后续匹配,则可以使用嵌套表达式。

sed  '0,/<tr/! s/<tr/<TR bgcolor='#E0E0E0'/' file.txt

这里,括号中的表达式将对第一部分的输出进行操作,但在这种情况下,它将在更改第一个匹配&#34; Jack&#34;后退出。

PS,我发现sed faq在这种情况下非常有帮助。