【问题标题】:why using "$$" (two dollar sign) instead of just "$" (single dollar sign) for blank line removal in Makefile? [duplicate]为什么在 Makefile 中使用“$$”(两个美元符号)而不是“$”(单个美元符号)来删除空行? [复制]
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • gnu.org/software/sed/manual/sed.html#BRE-syntax 同意:“$ 也仅在正则表达式或子表达式的末尾(即\)\| 之前)充当特殊字符,并且它在子表达式末尾的使用是不可移植的。"
  • @hek2mgl 是的。你绝对是对的。第一个美元符号是文字“$”,没有任何特殊含义,第二个美元符号表示行尾。我在 Makefile 之外尝试过它,它的行为与您预测的一样。但是在 Makefile 内部,它会删除空行。我认为这是我的错,我没有提到在 Makefile 中找到了这一行。我还是有点迷茫。
  • @hek2mgl 我重新表述了这个问题。谢谢你的回答。
  • 我不是 Makefile 专业人士。我建议等待@melpomene 返回并对此给出答案
  • 没关系。你已经帮了很多忙了。
猜你喜欢
  • 2010-11-22
  • 2023-03-30
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多