2

我正在尝试从具有键值顺序的许多段的行中提取单个字符串,但我没有得到它,因为它匹配的内容比我想要的要多得多。

这是我的示例行:

|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 之后立即提供整个内容,直到第一次出现 ~|

4

2 回答 2

2

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

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

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

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

于 2012-11-06T14:06:31.347 回答
0

我建议你把这条线分成几行|,然后从这些行中 grep:

$ 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~
于 2012-11-06T14:05:52.350 回答