我需要创建一个生成 Makefile 的脚本。
检查依赖项时,我会检查每个 .cpp 文件中的“---.h”标头。我使用:
echo $(awk '/^".*h"$/ { print $0 }' $file) >> Makefile
显然,获取“myheader.h”部分(排除“”)的最佳方法是什么。我可以用 awk 实现这个吗?优选地,越简单越好。在这一点上,我几乎不理解 awk。
更新:
以下解决了我的问题:
awk -F '"' '/\.h"/ {print $2}' $file
答案1
为什么awk
?为了这? grep -EPo '[^\s]+\.h[\s]' /path/to/src/*.cpp >> Makefile
应该可以解决问题。
答案2
发布的(目前已接受的)grep
答案有很多问题,其中最重要的是任何将打印包含序列的字符串.h
,而不仅仅是打印 Awk 脚本中正则表达式中匹配的序列(例如,来自结构成员引用,如linkedlist.head
)。我会用sed
这个:
sed -n 's/^"\(.*h\)"$/\1/p "$file" >> Makefile
我强烈怀疑OP没有实际上想要匹配任何以双引号中的字母结尾的字符串h
,这就是这个正则表达式的实际作用。也许更合理的猜测是这样的
sed -n 's/^ *# *include *"\([^"]*\.h\)".*$/\1/p < "$file" >> Makefile
前面有可选的空格#include
是一个有根据的猜测。这里的重点是正则表达式[^"]*\.h
,它捕获不包含双引号并以文字字符结尾的字符串.h
。
答案3
有了awk
,您可以使用:
awk -F '"' '
/^[[:blank:]]*#[[:blank:]]*include[[:blank:]]+".*\.h"/ {
print $2
}'
我们将字段分隔符设置为"
, 匹配看起来像这样的行
#include "something.h"
并从中提取第二个字段(即第一个字段和第二个字段之间的内容"
)。