awk 只打印匹配的单词

awk 只打印匹配的单词

我需要创建一个生成 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"

并从中提取第二个字段(即第一个字段和第二个字段之间的内容")。

相关内容