FreeBSD MacOS Grep 跨越多行

问题描述 投票:0回答:2

使用 MacOS High Sierra,尝试使用 grep 提取两个“标签”之间的文本。预期输出应该是“The Genre”。这是 .txt 文件:

<genre>
The Genre
</genre>

这是不起作用的 grep 命令:

genre=$(grep -o '(?<=<genre>).*?(=<\/genre>)' textfile.txt)

回声$流派

我在 MacOS 上处理这个问题的方式是错误的?我见过的所有带有标签的命令仅支持 BNU 或 Linux 变体。感谢帮助

macos terminal grep
2个回答
0
投票

对于多行搜索,您可以使用 MacOS/FreeBSD pcregrep 实用程序。它是通过 pcre 软件包

安装的
pcregrep -o -M '(?s)(?<=<genre>).*(?=<\/genre>)' textfile.txt

命令解释:

-o
- 显示匹配的字符串

-M
- 使用多行搜索

(?s)
- 制作“。”匹配任何字符,甚至是换行符

(?<=<genre>)
- 匹配前缀 但不在输出中显示它

(?=<\/genre>)
- 匹配后缀 但不在输出中显示它

重要提示: 此命令将匹配开始和结束标记之间的所有内容,包括换行符。所以输出将是这样的:


The Genre


0
投票

这不适用于 BSD grep。使用 GNU grep,您可以使用选项

--null-data
,但选项
-P
无法在此处可靠地用于具有后向和前向的模式。

其他一些 grep 可以匹配多行,例如 ugrep。它与 BSD/GNU grep 兼容,并且在模式中使用

\n
时匹配多行。不需要特殊选项。像这样:

ugrep -o '<genre>(.|\n)*</genre>' textfile.txt | ugrep -v '</?genre>'

第二个 ugrep 删除标签。

© www.soinside.com 2019 - 2024. All rights reserved.