替换匹配模式上方的行

时间:2015-06-22 13:39:24

标签: regex shell awk sed

我有一个html文件,里面有一个表格如下:

<td>unknown</td> <td>blah11</td> ... <td>unknown</td> <td>blah24</td> ...

我需要匹配'blah24'并将上面的'unknown'替换为'test'来给出:

<td>test</td> <td>blah24</td>

我试图研究sed&amp; awk解决方案,但只能找到“在匹配模式之前插入”或“在匹配模式之后替换”。

我只在使用cygwin的独立机器上提供了基本的shell工具。

2 个答案:

答案 0 :(得分:2)

$ awk 'NR>1{if(/blah24/) sub(/unknown/,"test",prev); print prev} {prev=$0} END{print prev}' file
<td>unknown</td>
<td>blah11</td>
...
<td>test</td>
<td>blah24</td>
...

如果blah24作为较长字符串的一部分出现,或者您确实想要专门替换unknown或标签内的任何内容或其他各种重要细节,那么您没有告诉我们该怎么办但希望你能解决上述问题。

答案 1 :(得分:1)

在sed中你可以做到

sed -n '/blah24/{x;s/unknown/test/;x};x;1!p;${x;p}' file

<td>unknown</td>
<td>blah11</td>
...
<td>test</td>
<td>blah24</td>
...

每一行都交换保持缓冲区的当前行。如果它找到了blah24,那么它会交换保持的行,将其更改为test,然后将其交换回来。它打印除1之外的每一行(因为它会打印一个空格)。