我正在尝试使用sed替换文件的每个其他html元素,以便我可以制作交替的颜色行。
这是我尝试过的,但它不起作用。
sed 's/<tr valign=top>/<tr valign=top bgcolor='#E0E0E0'>/2' untitled.html
答案 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)
试试这个。
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在这种情况下非常有帮助。