2013-11-09 158 views
10

我需要使用sed命令从bash脚本中删除所有标签。 我试着用这个Sed从html文件中删除标签

sed -r 's/[\<][\/]?[a-zA-Z0-9\=\"\-\#\.\& ]+[\/]?[\>]//g' $1 

和蒙山这个

sed -r 's/[\<][\/]?[.]*[\/]?[\\]?[\>]//g' $1 

但我还是错过了什么,有什么建议?

+2

这是我最喜欢的关于HTML和正则表达式的答案;-) http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

+1

我完美无缺知道它,但这是作业:-( – michste93

+0

我的学校时间很久以前,但我认为作业并不一定是一个完美的答案,它也是要表现出一些努力,并有勇气说,那就是所有我想出来的。:-) –

回答

40

您可以使用许多HTML to text converters之一,使用Perl的正则表达式,如果可能的<.+?>或者如果它必须是sed使用<[^>]*>

sed -e 's/<[^>]*>//g' file.html 

如果没有空间错误,请使用HTML解析器来代替。 例如当一个元素分为两行时

<div 
>Lorem ipsum</div> 

这个正则表达式不起作用。


这个正则表达式包括三个部分<[^>]*>

  • 搜索开口<
  • 后跟零个或多个字符*,这是不闭合>
    [...]是一个character class,当它以^开头时寻找字符在类
  • 终于寻找关闭>

更简单的正则表达式<.*>将无法​​正常工作,因为它搜索最长可能的匹配,即在输入行的最后收盘>。例如,当您在输入行有一个以上的标签

<name>Olaf</name> answers questions. 

将导致

回答问题。

,而不是

奥拉夫回答问题。

另请参阅Repetition with Star and Plus,特别是章节Watch Out for The Greediness!及以下,为详细解释。

+0

工程就像一个魅力..虽然我吸吮sed,所以你可以请解释<[^>] *>位? –

+0

'[^>]'是一个匹配任何字符的字符类,除了'>'和'*'表示重复匹配零次或多次。否则,'<.*>'将从第一个'<'到最后一个'>'匹配,通常跨越多个标签。 – tripleee