我有多行文字。我想提取某些模式之间的文本。
11 8 2 7
4
1 5 3 7
2 2 4 5
5 3 9 4
5 3 7 8
下面的代码打印为空:
$cat f1
START:
line1
line2
line3
line4
END
START
line a
line b
line c
END
答案 0 :(得分:1)
第一个问题是.
通常不会与换行符匹配。因此,(.*)
仅匹配到该行的末尾。您可以通过在正则表达式前面加上(?s)
来解决此问题,该正则表达式设置DOTALL标志。
第二个问题是.*
是 greedy ,这意味着它将尽可能多地吞噬。因此,它将获得第一个START
之后的所有字符,然后是直到 last END
的所有字符。要使其不贪婪,请将其更改为.*?
,以便它将在第一个START
之后和第一个END
之前捕获字符。
有了这些更改,您的声明将如下所示:
${m} Get Regexp Matches ${txt} (?s)START(.*?)END 1
这将导致两场比赛(为清楚起见,将其分开):
:\nline1\nline2\nline3\nline4\n
\nline a\nline b\nline c\n
如果您不希望使用换行符,则需要对数据进行进一步的处理。