我遇到了一些旧的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约定有关。有人会帮助解决这个难题吗?
答案 0 :(得分:3)
这不是不是安全机制,它只是正则表达式的一部分。在sed
使用的基本posix正则表达式中,$
没有特殊含义,除了在模式末尾使用时。表示表达式与可选包含制表符且以文字$
结尾的行匹配。如果您删除第二个$
,则sed
命令也会删除不以$
结尾的行。