【发布时间】:2021-03-01 15:01:45
【问题描述】:
我们有
...包含段落的文件,由 2 个换行符 \r\n\r\n 或 \n\n 分隔。段落本身可能包含单个换行符\r\n 或\n。目标是使用 Bash 单行来匹配仅第一段并将其打印到标准输出。
例如:
$ cat foo.txt
Foo
* Bar
Baz
* Foobar
Even more stuff to match here.
结果:
$ cat foo.txt | <some-command>
Foo
* Bar
我已经试过了
...这个正则表达式 (?s)(.+?)(\r?\n){2}|.+?$ 和 grep 使用
- Windows 上的 GIT Bash (GNU grep 3.1),
- Bash on Lubuntu 20.4.1 LTS (GNU grep 3.4) 和
- Mac 上的 iTerm+Fish (BSD grep 2.5.1-FreeBSD)。
前两种方法导致:
$ grep -Poz '(?s)(.+?)(\r?\n){2}|.+?$' foo.txt
Foo
* Bar
Baz
* Foobar
由于 BSD grep 和 GNU grep 之间的差异,Mac 上的方法失败了。
但是
... 在 regex101.com 上,此正则表达式适用于 foo.txt:https://regex101.com/r/uoej8O/1。这可能是由于禁用了global 标志?
【问题讨论】:
-
当你说 “可能包含单个换行符 \r\n 或 \n。” 你的意思是你在一个文件中混合了两种类型的行尾吗?或者您需要它来处理普通文件,其中一些具有 DOS 行结尾,而其中一些具有 Unix 行结尾?
-
@jas 因为 DOS 和 UNIX 结尾。
-
在使用任何 Unix shell 工具之前删除 DOS 行尾总是更安全,因为它可能会产生意想不到的结果。