【发布时间】:2015-07-12 17:29:51
【问题描述】:
“Unix 编程环境”指出,在 sed 的正则表达式中使用的 '$' 表示行尾,这对我来说很好,因为
cat file | sed 's/$/\n/'
被解释为“在每行末尾添加换行符”。
问题出现了,当我尝试使用命令时:
cat file | sed '$d'
这一行不应该删除每一行而不是最后一行吗?在这种情况下,美元符号表示最后一行的结束。我哪里错了?
【问题讨论】:
“Unix 编程环境”指出,在 sed 的正则表达式中使用的 '$' 表示行尾,这对我来说很好,因为
cat file | sed 's/$/\n/'
被解释为“在每行末尾添加换行符”。
问题出现了,当我尝试使用命令时:
cat file | sed '$d'
这一行不应该删除每一行而不是最后一行吗?在这种情况下,美元符号表示最后一行的结束。我哪里错了?
【问题讨论】:
$ 在s 命令的模式中使用时被视为正则表达式锚,例如
s/$/\n
但是在$d 中,$ 不是正则表达式锚,它是地址表示法,表示输入的最后一行,使用d 命令。
另请注意,cat 在您的最后一个命令中是不必要的。它可以用作:
sed '$d' file
【讨论】:
在第二种用法中,没有正则表达式。 $有一个地址,意思是最后一行。
【讨论】:
请注意,sed 中的regex 必须在分隔符(;、:、~ 等)内,而不是引号。
/regex/
例如:
sed '/foo/s/bar/bux/g' file
或
~regex~
例如:
sed 's~dd~s~' file
但不是'regex'。所以'$d' 中的$ 不会被sed 视为正则表达式。 '$d' 就像一个地址,指出最后一行。
【讨论】: