在(BSD)UNIX 环境中,我想使用正则表达式捕获特定的子字符串。
假设dmesg
命令输出将包括以下行:
pass2: <Marvell Console 1.01> Removable Processor SCSI device
我想捕获<
和>
字符之间的文本,例如
dmesg | <sed command>
应该输出:
Marvell Console 1.01
但是,如果正则表达式不匹配,它不应输出任何内容。如果找不到匹配项,许多解决方案包括sed -e 's/$regex/\1/
将输出整个输入,这不是我想要的。
相应的正则表达式可以是:
regex="^pass2\: \<(.*)\>"
我将如何正确使用sed
or进行正则表达式匹配grep
?请注意,该grep -P
选项在我的 BSD UNIX 发行版中不可用。但是,该sed -E
选项可用。
尝试这个,
或 POSIXly(
-E
截至 2019 年尚未达到 POSIX 标准):输出:
这只会打印
<...>
每行的最后一次出现。-o
在 grep 下只打印匹配的部分怎么样?不过,我们仍然需要删除<>
,但tr
可以在那里工作。我使用 sed、awk 和 python 尝试了以下 3 种方法
sed 命令
输出
awk 命令
输出
Python
输出
您可以使用以下
grep -o -e
命令提取子字符串:出于某种原因,此
*
grep+
正则表达式匹配命令中的 1 个或多个匹配无效。使用以下命令阅读 grep 手册:
阅读有关选项
-o
和-e
.我在工作中使用它从多个日志行中提取大量数据。