我有一个demo.html文件,因为它的内容是:

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

我希望使用Linux sed命令在和之间进行子串和提取其内容:
<table>
  some content here
</table>

对于这个需求,哪个命令更简单?

最佳答案

不确定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,在第一行观察到的模式“”上,它将“cf”(内容标志)设置为1(默认情况下,所有变量都初始化为0)。然后它会打印开始的“”标记,并触发下一行通过“getline”读取
现在,第二个最后的操作(在“END”之前的操作相当于/*/可以省略)将在设置“cf”时处于活动状态,它只打印所有原始行。因为'cf'是0,所以早期的html都不会被打印出来。
一旦看到结束的“”标记,它会将cf变量返回到0,并且后面的任何html都不会由“match all”操作打印出来。
特殊模式“END”只在分析完所有行之后调用,它所做的只是打印结束“”标记。
希望这是清楚的。

关于linux - Linux Shell用于subString多行内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23531971/

10-16 20:24