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

标签 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 之后开始直到第一次出现 ~| 的整个内容

最佳答案

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

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

如果您想包含尾随 ~|,请删除先行 (?=...)

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

关于regex - 获取一行中多次出现的两个字符之间的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13252553/

相关文章:

java - 引号内的数字 - 正则表达式

linux - 为什么 if [ !$(grep -q) ] 不起作用而 if grep -q 起作用?

xml - 在 xml 字符串上查找特定标签

bash - zgrep目录中的多个gz文件

Python 比较列表中的部分字符串

java - 替换正则表达式 java 中 [ 和 ] 之间的所有内容

python - 匹配直到第一次出现

grep - 如何截断 grep 或 ack 返回的长匹配行

grep - 基于缩进的grep

java - 编写正则表达式来验证电话号码