2012-10-03 267 views
1

我想解析出我有文件的项目。我无法弄清楚如何使用grep做到这一点 这里是语法简单Grep问题

<FQDN>Compname.dom.domain.com</FQDN> 

<FQDN>Compname1.dom.domain.com</FQDN> 

<FQDN>Compname2.dom.domain.com</FQDN> 

我要吐了出来正好之间的位>和< 任何人都可以帮助? 谢谢

+1

,你可以用sed在Linux上。 http://unixhelp.ed.ac.uk/CGI/man-cgi?sed –

回答

1

的grep可以做一些文本提取。但不知道这是你想要什么:

grep -Po "(?<=>)[^<]*" 

测试

kent$ echo "<FQDN>Compname.dom.domain.com</FQDN> 
dquote> 
dquote> <FQDN>Compname1.dom.domain.com</FQDN> 
dquote> 
dquote> <FQDN>Compname2.dom.domain.com</FQDN>"|grep -Po "(?<=>)[^<]*" 
Compname.dom.domain.com 
Compname1.dom.domain.com 
Compname2.dom.domain.com 
+0

谢谢。完美的作品! –

+1

@n_hov - 我怀疑这只适用于Linux,因为afaik是grep支持PCRE的唯一地方。如果你只会在Linux中这样做,那么这是一个很好的答案。如果你可能使用FreeBSD,NetBSD,OSX,Solaris,HP/UX等,你应该看看其他解决方案来保持你的选择。 – ghoti

1

你可以像你想grep

grep -oP '<FQDN>\K[^<]+' FILE 

输出

Compname.dom.domain.com 
Compname1.dom.domain.com 
Compname2.dom.domain.com 
+1

这是如何工作的?我看到*它做了什么,我只是没有看到'\ K'在之前的正则表达式中这样做! – ghoti

+0

像维基百科所说:_Since版本7.2,\ K可以用于模式重置当前整个比赛的开始。这为隐藏断言提供了一种灵活的替代方法,因为匹配的丢弃部分(\ K之前的部分)不需要长度固定。http://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions –

+0

啊,我不会在维基百科上查看grep的文档。 :-)谢谢,这可能会派上用场。 – ghoti

1

正如其他人所说,grep的是不是这个的理想工具。然而:

$ echo '<FQDN>Compname.dom.domain.com</FQDN>' | egrep -io '[a-z]+\.[^<]+' 
Compname.dom.domain.com 

请记住,grep的目的是匹配的东西。 -o选项会显示它匹配的内容。为了使正则表达式的条件不是返回的表达式的一部分,你需要使用lookahead或lookbehind,这是大多数命令行grep所不支持的,因为它是PCRE的一部分,而不是ERE。

$ echo '<FQDN>Compname.dom.domain.com</FQDN>' | grep -Po '(?<=>)[^<]+' 
Compname.dom.domain.com 

-P选项将在大多数Linux环境中工作,但不是在* BSD或OSX或Solaris等