如何在多次或多次条件下提取HTML标签之间的文本

时间:2016-09-23 00:01:39

标签: linux bash awk sed grep

我一直在研究如何从html中提取标题标签。我几乎已经发现正则表达式和HTML没有混合,可以使用grep。但是,我找到的代码here,如下所示:

awk -vRS="</title>" '/<title>/{gsub(/.*<title>|\n+/,"");print;exit}'

现在,这只能在标题标签之间找到一次文本。我想知道如何让它在每一行上运行。我可以做cat file; while read line; do ...; done。但是,我知道这可能不是很有效,而且还有更好的方法。

其次,在文件中我需要保留以字符串&#39; - &#39;开头的所有行。我认为这需要添加&#39;或&#39; awk中的语句,以便与标题标记和以&#39;开头的任何行匹配 - &#39;

输入文件如下所示:

text text text <title>random text of the title 1</title> random html stuff
--time--
xyz more random text <title>random text of the title 2</title> hmtl text
--time--
some text <title>random text of the title 3</title> more text tags
--time--
text here <title>random text of the title 4</title> random text html
--time--

所需的输出:

<title>random text of the title 1</title>
--time--
<title>random text of the title 2</title>
--time--
<title>random text of the title 3</title>
--time--
<title>random text of the title 4</title>
--time--

我对awk并不是那么好,但我在学习。我知道应该有一个选项可以打印所有,但它是我真正坚持的OR语句。如果你觉得效率更高,我愿意接受sed或grep。非常感谢任何帮助或方向。

1 个答案:

答案 0 :(得分:1)

对于您的输入,grep就足够了

$ grep -o '<.*>\|^--.*' ip.html 
<title>random text of the title 1</title>
--time--
<title>random text of the title 2</title>
--time--
<title>random text of the title 3</title>
--time--
<title>random text of the title 4</title>
--time--
  • -o仅提取匹配的部分
  • <.*><中提取到行中的最后>
  • \|^--.*备用模式,如果行以--开头,则从该行获取所有内容

仅限于title代码,

grep -o '<title.*title>\|^--.*' ip.html