【发布时间】:2021-03-06 04:15:10
【问题描述】:
我在这个表格上有一个文件:
X/this is the first match/blabla
X-this is
the second match-
and here we have some fluff.
我想提取出现在“X”之后和相同标记之间的所有内容。所以如果我有“X+match+”,我想得到“match”,因为它出现在“X”之后和标记“+”之间。
所以对于给定的示例文件,我希望得到这个输出:
this is the first match
然后
this is
the second match
我设法获得了 X 之间的所有内容,后跟一个标记:
grep -zPo '(?<=X(.))(.|\n)+(?=\1)' file
即:
-
grep -Po '(?<=X(.))(.|\n)+(?=\1)'匹配 X 后跟(something),后者被捕获并在末尾与(?=\1)匹配(我的代码基于 my answer here)。 - 请注意,我使用
(.|\n)匹配任何内容,包括新行,并且我还在 grep 中使用-z匹配新行。
所以这很好用,唯一的问题来自输出的显示:
$ grep -zPo '(?<=X(.))(.|\n)+(?=\1)' file
this is the first matchthis is
the second match
如您所见,所有匹配项一起出现,“这是第一个匹配项”后面是“这是第二个匹配项”,根本没有分隔符。我知道这来自“-z”的使用,它将所有文件 视为一组行,每行都以零字节(ASCII NUL 字符)而不是换行符结束(引用“人 grep")。
那么:有没有办法分别获得所有这些结果?
我也在 GNU Awk 中尝试过:
awk 'match($0, /X(.)(\n|.*)\1/, a) {print a[1]}' file
但即使是 (\n|.*) 也不起作用。
【问题讨论】:
标签: regex awk grep text-processing