Linux Shell for subString muliti-lines内容

时间:2014-05-08 02:58:15

标签: linux shell sed

我有一个demo.html文件,其内容是:

<html>
<header><header>
<body><table>
   some content here 
</table>
<body>
</html>

我想使用Linux sed命令来subString并在之间和之间提取其内容:

<table>
  some content here 
</table>

对于此要求,哪个命令会更简单?

2 个答案:

答案 0 :(得分:1)

不确定sed但是在awk中是可行的:

awk '/<table>/ { cf=1; print "<table>"; getline } /<\/table>/ {cf = 0 } {if(cf == 1){print $0}}END{ print "</table>" }' demo.html

我在demo.html上尝试了这个,它似乎按预期工作。

一些假设:

1)所有内容均以开始标记

后面的行开头

2)结束标记出现在它自己的行中 - 即在结束标记出现之前该行中没有部分内容。

这种可读格式的代码可能更明显:

awk ' /<table>/    { cf=1 
                     print "<table>" 
                     getline 
                   }

      /<\/table>/  { cf = 0 
                   } 

                   { if(cf == 1)
                     {
                       print $0
                     }
                   }

      END          { print "</table>" 
                   }' 

假设你熟悉awk,在一行中观察到的第一个模式,&#39;&#39;,它设置了&#39; cf&#39; (内容标志)为1(默认情况下,所有变量都初始化为0)。然后它打印开头&#39;&#39;标记,并通过&#39; getline&#39;

触发下一行

现在,第二个最后一个动作(前一个&#39; END&#39;相当于/ * /可以省略的动作)将作为&#39; cf&#39;设置 - 它只打印所有原始行。早些时候&#39; cf&#39;是0,没有一个早期的html被打印出来。

一旦结束&#39;&#39;看到标签后,它会将cf变量翻转为0,并且任何后续的html都不会被&#39;匹配全部&#39;动作。

特殊模式,&#39; END&#39;只有在解析了所有行之后才会调用它,而它所做的只是打印我们的结束&#39;&#39;标签

希望这很清楚。

答案 1 :(得分:0)

我通过awk解决了这个问题:

awk '/^<table>/,/<\/table>$/ { print }' demo.html