Jer*_*rry 5 linux sed gnu-make
最近在学习GNU make。以下是 GNU make 手册中自动生成依赖项的示例。我知道上面脚本的一般含义(它基本上是用命令用其他东西替换一些东西sed)。但我对命令中的细节有两个问题。\1.o首先,命令中的含义是什么?与位置参数有关吗?其次,为什么$*要放入一对,()因为$*它本身已经意味着目标文件名的主干?(我尝试不加括号,但没有成功。)
%.d: %.c
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法,但没有成功。
%.d: %.c
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,$*\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
Run Code Online (Sandbox Code Playgroud)
谁能解释一下背后的原因吗?谢谢。
文本被解释多次。
\n\n\'s,\\($*\\)\\.o[ :]*,\\1.o $@ : ,g\'\nRun Code Online (Sandbox Code Playgroud)\n\n第一步,Make 扩展$变量。例如:
\'s,\\(foo\\)\\.o[ :]*,\\1.o foo.d : ,g\'\nRun Code Online (Sandbox Code Playgroud)\n\n接下来,该字符串被传递到 Shell,后者会去掉引号。
\n\ns,\\(foo\\)\\.o[ :]*,\\1.o foo.d : ,g\nRun Code Online (Sandbox Code Playgroud)\n\n最后由 来解读sed。在默认情况下理解的基本正则表达式中sed,\\(\xe2\x80\xa6\\)简单匹配\xe2\x80\xa6但对匹配进行分组。然后,在替换中,您可以引用匹配的文本。 指的是匹配的第 N个组。所以在这个例子中,简单地引用任何匹配的 \xe2\x80\x93 可能。(如果扩展到正则表达式中具有特殊含义的内容,您可能会遇到麻烦。请注意,反向引用使正则表达式变得非正则,但这可能与这里无关。)\\N\\1$*foo$*
根据我的理解,这不是一种非常可靠的编写替换的方法,并且实际上没有必要在这里使用反向引用。通过这样的替换,可以更有效地实现预期的效果。
\n\n\'s,[^:]*:,$*.o $@ :,g\'\nRun Code Online (Sandbox Code Playgroud)\n