多行 grep - 这个表达式有什么问题?

多行 grep - 这个表达式有什么问题?

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

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.

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

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

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

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

我也尝试过 awk 和 grep 的-z标志,但是对于这两种方法,我要么得到每一行,要么并非所有行都与我的表达式匹配。

答案1

你可以使用这个:

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

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.

相关内容