我有这个源文件.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