2013-03-14 152 views
0

我想要使用grep命令或只是知道regex以获得“>”和“<”字符之间的以下字符串。使用正则表达式来检索字符之间的字符串

字符串:

<f id=mos-title>demo-break-1</f> 

我想回

demo-break-1 
+4

[这是您需要的正则表达式。](http://en.wikipedia.org/wiki/XPath) – 2013-03-14 22:10:17

+2

另一种方法:http://stackoverflow.com/questions/1732348/regex-match-open-tags-除了-XHTML-自足标签 – 2013-03-14 22:13:45

回答

0

假设文件foo包含:

<f id=mos-title>demo-break-1</f> 
<f id=mos-title>demo-break-2</f> 
<f id=mos-title>demo-break-3</f> 
<a>foo testing</a> 

你可以做这样的事情:

perl -ne 'print "$1\n" if /<.+id=mos-title>(.+?)<\/f>/' foo 

请记住,这将是严格的,因为这些匹配只发生在一行上。此外,由于这不是有效的HTML解析器,因此您必须考虑格式中的任何偏差。

尽管严格但仍不是100%的HTML兼容,这是一个更轻松的方法。

perl -ne 'print "$1\n" if /<.+id=mos-title\b.*?>\s*(.+?)\s*<\/f>/' foo 

输出将如下所示:

demo-break-1 
demo-break-2 
demo-break-3 
0

如果你有一个正确的XML文件是这样的:

<root> 
    <f id="mos-title">demo-break-1</f> 
</root> 

你可以使用一个适当的解析器:

xmllint --xpath "/root/f[@id='mos-title']" input.xml | \ 
     sed 's/[^>]*>\([^<]*\)<[^>]*>/\1\n/g' 

随着你的输入,你是确保的输入格式是一致的(即产生),可以使用SED:

sed 's/[^>]*>\([^<]*\)<[^>]*>/\1/g' input 
0

通常最好使用XML解析器,但你可以试试这个AWK:

awk '$1==s{print $2}' s="f id=mos-title" RS=\< FS=\> file 
相关问题