获取在一行中多次出现的两个字符之间的字符串

时间:2012-11-06 13:55:52

标签: regex grep

我正在尝试从按键值顺序中包含多个段的行中提取单个字符串,但是我没有得到它,因为它匹配的次数比我想要的要多得多。

这是我的示例行:

|SEGA~1~MAGIC~DESCRIPTION~~~M~TEST~|SEGB~34~12.11.2011~3~M~O~|SEGC~HELLO~WORLD~|

这一行是将许多段串联成一行。现在我想从SEGA开始提取段中索引2处的字符串。 所以我所做的就是grep:

egrep -o 'SEGA(.*?)\~\|'

但它给了我整条线,有时它只给我我想要的部分。通过匹配,我将使用〜字符拆分该段,然后取第三个。 因为我用。*?带有问号我希望egrep只匹配SEGA和第一次出现〜|之间的内容这是在SEGB之前,而不是在SEGC或SEGB结束时。

如何告诉grep搜索SEGA并在SEGA之后立即开始全部内容,直到第一次出现〜|

2 个答案:

答案 0 :(得分:2)

您可以在grep中使用-P( - perl-regexp)选项:

grep -oP '(?<=SEGA).*?(?=~\|)' file

如果您想要包含尾随~|,请删除前瞻(?=...)

我认为.*?(懒惰)不会在egrep中退出。

答案 1 :(得分:0)

我建议你将这行划分为|上的行,然后从这些行中删除:

$ echo "|SEGA~1~MAGIC~DESCRIPTION~~~M~TEST~|SEGB~34~12.11.2011~3~M~O~|SEGC~HELLO~WORLD~|" | sed -e 's/|/\n/g' | grep ^SEGA
SEGA~1~MAGIC~DESCRIPTION~~~M~TEST~