grep只与正则表达式一行中的第一个匹配

时间:2017-10-09 15:38:41

标签: linux grep pattern-matching

我有一些xml文件,在将它解析为Python中的csv文件(内存问题)之前,我想做一些预处理。

说我想从像

这样的xml文件中查找标题包含“abcd”的内容
<Title> Project abcd </Title> <Id> xxxx</Id> <Group>xxxx</Group>... <Title> Project abcd </Title>

由于重复的标题字段,如果我这样做

grep -Ei "<Title>.*abcd.* </Title>"

如果“abcd”巧合地包含在Id或其他不相关的字段中,它将返回该行。

有没有办法可以使用grep返回只有Title字段包含我想要找到的模式的行?

2 个答案:

答案 0 :(得分:0)

你应该知道风险,用正则表达式解析html / xml。如果你必须这样做, 尝试

'<Title>[^<]*abcd[^<]*</Title>'

答案 1 :(得分:0)

使用xml / html解析器是操作xml / html数据的正确方法:

xmlstarlet 解决方案:

xmlstarlet sel -t -c "//Title[contains(text(),"abcd")]" -n your.xml

输出(用于当前输入):

<Title> Project abcd </Title><Title> Project abcd </Title>