我正在尝试从按键值顺序中包含多个段的行中提取单个字符串,但是我没有得到它,因为它匹配的次数比我想要的要多得多。
这是我的示例行:
|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之后立即开始全部内容,直到第一次出现〜|
答案 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~