为什么在Makefile中使用“ $$”(两个美元符号)而不是仅使用“ $”(单个美元符号)删除空白行?

时间:2019-08-01 02:47:28

标签: regex sed makefile gnu-make

我遇到了一些旧的Makefile脚本,该脚本旨在使用sed命令删除空白行。代码本身非常容易和直接。

sed -i -e '/^[ \t]*$$/ d'

我知道^[ \t]*$部分仅表示一行以空格或制表符开头,然后重复零次或多次直到该行结束。我不太明白为什么在正则表达式的末尾还有一个附加的“ $”符号。 我也尝试仅使用单个$符号。似乎可以达到相同的效果。

sed -i -e '/^[ \t]*$/ d'

那么在这种情况下使用双美元符号的目的是什么?

-------------------------附加评论--------------------

我没有提到它来自Makefile是我的错。我天真地认为,无论是在Makefile内部还是外部,都是一样的。命令是这样的:

RM_BLANK: org_file @cpp org_file | sed -e 's/ */ /g' > file @sed -i -e '/^[ \t]*$$/ d' file

org_file是包含很多空白行的文件。

如果直接在org_file上执行$$命令,那么它(我的意思是sed)的行为与hek2mgl在makefile之外使用时的预期完全相同。它仅删除以$结尾的行,而保留没有$的空行。但是当在Makefile环境中使用时,它仅删除行末没有$的空白行。我认为这可能与Makefile约定有关。有人会帮助解决这个难题吗?

1 个答案:

答案 0 :(得分:3)

这不是不是安全机制,它只是正则表达式的一部分。在sed使用的基本posix正则表达式中,$没有特殊含义,除了在模式末尾使用时。表示表达式与可选包含制表符且以文字$结尾的行匹配。如果您删除第二个$,则sed命令也会删除不以$结尾的行。

http://man7.org/linux/man-pages/man7/regex.7.html