Sed 和美元符号

Sed and dollar sign

"The Unix Programming Environment" 声明在 sed 的正则表达式中使用的“$”表示行尾,这对我来说很好,因为

cat file | sed 's/$/\n/'

被解释为"add newline at the end of each line"。

问题出现了,当我尝试使用命令时:

cat file | sed '$d'

这一行不应该删除每一行而不是最后一行吗?在此上下文中,美元符号表示最后一行的结尾。我哪里错了?

请注意,sed 中的 regex 必须位于分隔符(;:~ 等)内,引号除外。

/regex/

例如:

sed '/foo/s/bar/bux/g' file

~regex~

例如:

sed 's~dd~s~' file

但不是 'regex'。因此 '$d' 中的 $ 不会被 sed 视为正则表达式。 '$d' 就像一个指向最后一行的地址。

第二种用法,没有正则表达式。 $里面有个地址,意思是最后一行。

$s 命令的模式中使用时被视为正则表达式锚点,例如

s/$/\n

但是在 $d 中,$ 不是 正则表达式锚点,地址符号表示 最后一行 [=输入的26=],使用d命令删除。

另请注意,cat 在您的最后一个命令中是不必要的。它可以用作:

sed '$d' file