显示符合特定条件的Makefile中的行

时间:2014-12-20 13:34:08

标签: linux awk sed grep

我在项目中有很多make文件,我想要一个grep / sed正则表达式来打印项目中具有非隐式目标的make文件中的所有行。例如,在下面的示例中,我将alltestclean作为非隐式目标,但不是.c.o.

#
# This is and example make file:
#

CFLAGS = --std=c99 -0
OBJS = foo.o bar.o baz.o
CC=arm-eabi-gcc

all: test

test: $(OBJS)
    $(CC) -o $@ $<
    strip $@

clean:
    rm -rf *o hello

.c.o:
    $(CC) $(CFLAGS) -c $<

如果将它们打印在控制台上,那就足够了。有了这个,我知道哪些make文件需要修改。还有其他场景,但是如果我开始工作,我也可以调整其他案例的正则表达式。

理想情况下,我正在寻找命令,如果在上面的make文件上运行只打印...

all: test
test: $(OBJS)
clean:

3 个答案:

答案 0 :(得分:3)

这并不完全符合您的规范,但我认为发布它也很有用(并且可以通过微小的更改进行调整):

sed -n 's/^\([^.%#[:space:]]*\):.*$/\1/p' makefile
  • -n 禁用将所有行打印到stdout的默认sed行为
  • ^[^.%#[:space:]] 匹配.%#开头的行或任何空白角色。
  • 捕获第一个:之前的所有字符。
  • 该行的其余部分与.*$
  • 匹配
  • 然后,整个行被捕获的部分
  • 代替
  • p命令打印已转换的行,从而打印捕获的部分。

makefile上的输出示例:

all
test
clean

答案 1 :(得分:2)

试试这个

grep '^[^!.#\;]*:' MakeFile

答案 2 :(得分:2)

似乎在:之前必须只包含字母,如果是,那么您可以尝试下面的内容。

$ grep '^[a-zA-Z]\+:' file
all: test
test: $(OBJS)
clean: