使用sgrep,结构化grep,如何重置sgrep的区域计数器,以便sgrep在每个< tr>内部再次从1开始计数。元件。
考虑以下示例输入html表片段。它有不规则的结构;它在同一行上有多个标签,每个tr标签内有可变数量的td标签:
<tr><td>2015</td><td>Jane</td>
<td>Smith</td></tr>
<tr><td>2011</td>
<td>Sarah</td>
</tr>
我的示例sgrep命令行是:
sgrep -o'--%n:%r--\n' '"<td>" .. "</td>"' in.txt
我得到了这个输出:
--1:<td>2015</td>--
--2:<td>Jane</td>--
--3:<td>Smith</td>--
--4:<td>2011</td>--
--5:<td>Sarah</td>--
相反,我希望得到这个输出:
--1:<td>2015</td>--
--2:<td>Jane</td>--
--3:<td>Smith</td>--
--1:<td>2011</td>--
--2:<td>Sarah</td>--
sgrep的区域计数器%n每次进入tr标签时重置为1.
答案 0 :(得分:1)
无法重置sgrep输出格式模式的区域计数器%n。因此,需要使用一些其他工具,例如ritesht93建议的awk来解决此任务。通常,使用-o开关给出的sgrep输出格式模式允许以非常简单的方式修饰(或替换)结果区域。也就是说,搜索表达式的值是一组区域,没有其本地上下文的任何信息,例如周围元素。输出格式模式仅以默认顺序应用于结果中的每个区域,并将每个应用程序的结果附加到输出。
此致,原始sgrep的联合设计师PekkaKilpeläinen
答案 1 :(得分:0)
您也可以使用简单的1个awk
:
$ cat file1
<tr>
<td>2015</td>
<td>Jane</td>
<td>Smith</td>
</tr>
<tr>
<td>2011</td>
<td>Sarah</td>
<td>Holmes</td>
</tr>
$ awk -v cnter=0 '/td/ {cnter=cnter%3+1; print cnter":"$1}' file1
1:<td>2015</td>
2:<td>Jane</td>
3:<td>Smith</td>
1:<td>2011</td>
2:<td>Sarah</td>
3:<td>Holmes</td>
$