考虑这个示例文件(行号仅供参考):
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.