Multiline grepping – 这个表达式有什么问题?

ble*_*ft2 6 grep regular-expression

考虑这个示例文件(行号仅供参考):

1 Reference duiarneutdigane uditraenturida enudtiar.
2
3 Reference uiae uiaetrtdnsu iatdne uiatrdenu diaren uidtae
4 on line 23.
5
6 uiae
7
8 uaiernd Reference uriadne udtiraeb unledut iaeru uilaedr
9 uiarnde line 234.
Run Code Online (Sandbox Code Playgroud)

我希望使用此 grep 命令(tst 是示例文件)匹配以“Reference”开头并以句点结尾的每个字符串(即 ll.1、3-4 和 8-9):

grep -P '(?s)Reference.*?\.' tst

但是,它只匹配第一行。我在想什么:

  • (?s), 所以.匹配所有字符,包括换行符
  • .*? 应该使星不贪婪,因此如果它以句点结尾,则它不匹配整个文件。
  • 该表达式应以文字句点结束\.

我也试过 awk 和 grep 的-z标志,但是我要么得到每一行,要么不是所有的行都与我的表达相匹配。

vat*_*sug 4

你可以使用这个:

grep -Pzo '(?s)Reference.*?\.' tst.txt
Run Code Online (Sandbox Code Playgroud)

tst.txt你的输入文件在哪里。它与您的正则表达式相同,但有两个新标志。

我添加了-z标志来抑制行尾的换行符,并将其替换为空字符。因此grep知道行尾在哪里,但将输入视为一大行。

-o标志意味着它只打印匹配的部分。

我得到以下输出:

Reference duiarneutdigane uditraenturida enudtiar.
Reference uiae uiaetrtdnsu iatdne uiatrdenu diaren uidtae
on line 23.
Reference uriadne udtiraeb unledut iaeru uilaedr
uiarnde line 234.
Run Code Online (Sandbox Code Playgroud)