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
"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