我试图从按键值顺序包含多个段的行中提取单个字符串,但我没有得到它,因为它匹配的内容比我想要的要多得多。
这是我的示例行:
|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 之后开始直到第一次出现 ~| 的整个内容
最佳答案
您可以在 grep 中使用 -P
(--perl-regexp) 选项:
grep -oP '(?<=SEGA).*?(?=~\|)' file
如果您想包含尾随 ~|
,请删除先行 (?=...)
。
我认为.*?
(懒惰)不会在egrep中退出。
关于regex - 获取一行中多次出现的两个字符之间的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13252553/