regex - 为什么在 Makefile 中使用 "$$"(两个美元符号)而不是 "$"(一个美元符号)来删除空行?

标签 regex sed makefile gnu-make

<分区>

我遇到了一些旧的 Makefile 脚本,该脚本旨在使用 sed 命令删除空行。代码本身非常简单明了。

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

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

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

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

------------------------补充说明--------------------

我没有提到它来自 Makefile,这是我的错。我天真地以为不管在Makefile里面还是外面都是一样的。命令是这样的:

RM_BLANK:组织文件 @cpp 组织文件 | sed -e 's/*//g' > 文件 @sed -i -e '/^[\t]*$$/d' 文件

org_file 是包含大量空白行的文件。

如果 sed 命令直接在 org_file 上执行,它(我的意思是使用 $$)的行为与在 Makefile 外部使用时 hek2mgl 的回答完全一样。它只删除以 $ 结尾的行,并保留没有 $ 的空行。但是当在 Makefile 环境中使用时,它只是删除行尾没有 $ 的空行。我认为这可能与 Makefile 约定有关。有人可以帮忙解决这个难题吗?

最佳答案

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

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

关于regex - 为什么在 Makefile 中使用 "$$"(两个美元符号)而不是 "$"(一个美元符号)来删除空行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57301214/

相关文章:

Java - 使用正则表达式从 requestURI 中提取电子邮件地址

linux - 如何使用 sed 复制十六进制格式的行?

c - 如何在我的项目中使用 Linux like CONFIG_* 配置?

c++ - 未添加 CMake 包含目录

node.js - 为什么我的 makefile 没有设置 NODE_ENV?

python - 用于捕获所有出现的由一系列字符分隔的文本的正则表达式

regex - 我想从工作区中的一个文件中搜索第 n 行,并将其替换为另一个文件中保存的第 n 行

sed - 使用 sed 替换字符串之间的文本

ios - 获取 <BR> 和 : without <BR> inside the substring 之间的字符串

linux - sed 未按预期工作,但仅适用于目录深度大于 1