我有一个demo.html文件,其内容是:
<html>
<header><header>
<body><table>
some content here
</table>
<body>
</html>
我想使用Linux sed命令来subString并在之间和之间提取其内容:
<table>
some content here
</table>
对于此要求,哪个命令会更简单?
答案 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