使用 MacOS High Sierra,尝试使用 grep 提取两个“标签”之间的文本。预期输出应该是“The Genre”。这是 .txt 文件:
<genre>
The Genre
</genre>
这是不起作用的 grep 命令:
genre=$(grep -o '(?<=<genre>).*?(=<\/genre>)' textfile.txt)
回声$流派
我在 MacOS 上处理这个问题的方式是错误的?我见过的所有带有标签的命令仅支持 BNU 或 Linux 变体。感谢帮助
对于多行搜索,您可以使用 MacOS/FreeBSD pcregrep 实用程序。它是通过 pcre 软件包
安装的pcregrep -o -M '(?s)(?<=<genre>).*(?=<\/genre>)' textfile.txt
命令解释:
-o
- 显示匹配的字符串
-M
- 使用多行搜索
(?s)
- 制作“。”匹配任何字符,甚至是换行符
(?<=<genre>)
- 匹配前缀 (?=<\/genre>)
- 匹配后缀 但不在输出中显示它
重要提示: 此命令将匹配开始和结束标记之间的所有内容,包括换行符。所以输出将是这样的:
The Genre
这不适用于 BSD grep。使用 GNU grep,您可以使用选项
--null-data
,但选项 -P
无法在此处可靠地用于具有后向和前向的模式。
其他一些 grep 可以匹配多行,例如 ugrep。它与 BSD/GNU grep 兼容,并且在模式中使用
\n
时匹配多行。不需要特殊选项。像这样:
ugrep -o '<genre>(.|\n)*</genre>' textfile.txt | ugrep -v '</?genre>'
第二个 ugrep 删除标签。