【发布时间】:2019-08-01 02:47:28
【问题描述】:
我遇到了一些旧的 Makefile 脚本,该脚本旨在使用 sed 命令删除空白行。代码本身非常简单明了。
sed -i -e '/^[ \t]*$$/ d'
我知道^[ \t]*$ 部分只是表示一行以空格或制表符开头,然后重复零次或多次直到行尾。我不太明白为什么正则表达式末尾有一个额外的“$”符号。
我也尝试只使用单个 $ 符号。似乎可以达到同样的效果。
sed -i -e '/^[ \t]*$/ d'
那么在这种情况下使用双美元符号的目的是什么?
--------------额外的cmets--------
我没有提到它来自 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 约定有关。有人可以帮忙解决这个难题吗?
【问题讨论】:
-
$$仍然匹配行尾(两次!)。这是一个实际上并没有造成问题的疏忽。 -
@Bohemian 我明白了。但是匹配一次行尾就足够了,对吧?这样做有什么安全理由吗?
-
@Bohemian 我承认我花了一段时间,但这不是疏忽
-
这段代码是 Makefile 的一部分吗?
-
因为
\S是\s的对偶,所以另一种解决方案是sed -i '/\S/!d' file
标签: regex sed makefile gnu-make