我有一个 html 页面,其中包含两个表。
两个表都以相同的标签“ <table role="grid">
”开头,我想显示第二个表代码。
目前,我知道只显示第一个:
sed -n '/<table role=\"grid\">/,/<\/table>/p' page.html
你会怎么做?
答案1
这可行,但我确信必须有一个更简单的解决方案:
sed -n '/<table role=\"grid\">/{
x
/^$/b
x
:loop
p
/<\/table>/q
n
b loop
}'
匹配时,table
该行与保留空间交换(x),并比较旧的保留内容。第一次它们将为空 (/^$/),因此我们将 (b) 分支到脚本末尾。下一次,保留将不会为空(它有第一个表行)。因此,我们撤消交换(x)并开始一个循环,打印该行(p),直到我们退出(q)时匹配表尾。每次我们得到下一行 (n) 并分支回循环标签。
在 awk 中更简单:
awk '/<table role=\"grid\">/,/<\/table>/ { if(n==1)print }
/<\/table>/ { n++ }'
答案2
我会用perl
:
perl -ne 'if(/<table role="grid">/){$i++;$k=1}
if($i==2 && $k==1){print}
if(/<\/table>/){$k=0;}' file
解释
perl -ne
:逐行读取输入文件并将给定的脚本应用于-e
每一行。if(/<table role="grid">/){$i++;$k=1}
:如果该行匹配<table role="grid">
,则将 的值加 1$i
并设置$k
为 1。if($i==2 && $k==1){print}
:如果 的当前值为$i
2 并且 的当前值为$k
1(因此,如果我们位于 a<table role="grid">
和 a之间</table>
并且这是第二次<table role="grid">
看到),则打印当前行。if(/<\/table>/){$k=0;}
:$k
如果此行匹配,则设置回 0</table>
。