sed - 如何从第二个模式打印文本块?

sed - 如何从第二个模式打印文本块?

我有一个 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}:如果 的当前值为$i2 并且 的当前值为$k1(因此,如果我们位于 a<table role="grid">和 a之间</table>并且这是第二次<table role="grid">看到),则打印当前行。
  • if(/<\/table>/){$k=0;}$k如果此行匹配,则设置回 0 </table>

相关内容