sed 中的正则表达式不像 PCRE 中那样工作

sed 中的正则表达式不像 PCRE 中那样工作

我有这个源文件.c:

#include <dir/header1>
#include <dir/header2>
#include <dir/header3>
...

我只想匹配 dir 之后的那些标头(例如header1)。我这样做:

$ sed -En 's/\/(.*)>/\1/p' file.c

但会输出:

#include <dirheader1,所以它从行的开头匹配,但我想从/字符分组(因此s/\/...)。所以我尝试过:

$ sed -En 's/<.*\/(.*)>/\1/p' file.c

这都没有帮助。那么如何实现呢?

答案1

要仅提取使用命令headerx显示的三行中的位,您必须s///sed消除该行中您不想要的所有位。

您不需要的行的位是#include <dir/开头的初始字符串和>末尾的最终字符串。这必须全部与您的正则表达式匹配。然后还使用捕获组来替换初始字符串和最终字符串之间的位整条线与捕获的字符串:

sed -n 's,.*/\(.*\)>,\1,p' file.c

或者,更明确地说,

sed -n 's,^#include <dir/\(.*\)>,\1,p' file.c

答案2

您不会放弃比赛的第一部分,因此您可以更正您的代码来做到这一点..根据@kusalananada

或者使用否定模式的通用匹配

sed -En "s|[^/]+/([^>]+)>|\1|p" file

对于特定的匹配#include

sed -En "s|^#include <dir/([^>]+)>|\1|p" file

或者grep虽然你

grep -Po "(?<=#include <dir/)[^>]+" file

或者与gawk

awk -F"/|>" '$1~include{print $(NF-1)}' file

相关内容