我正在尝试使用sed
来反转打印文件(我知道它可以通过其他方式完成,例如tac
)。这是我到目前为止所得到的:
sed -n -r '/.+/{x;H;$p}' nums
文件nums
在每行包含一个数字,从1到25.逻辑是这样,每个数字首先复制到holdspace
,而holdspace
的内容被复制到patspace
到x;
。所以现在holdspace
包含当前数字,而patspace
包含到目前为止的数字。然后H;
将到目前为止经历的数字列表附加到holdspace
,以便最新的numbr始终保持在最前面。最后,当到达最后一行时,它最后一次完成,并通过$p
打印出来。
但是,该命令仅以相反的顺序输出数字24到1。第一行应该是25,但不知何故该行被跳过。
有谁能告诉我这段代码有什么问题?
答案 0 :(得分:2)
您最后错过了一次x
。您将最后一行的内容交换到保留空间,但在打印之前永远不会将其拉出来。
sed -n -r -e '/.+/{x;H}' -e '${x;p}'
你还得到一个额外的空白行,因为你真的不想做' H'在第一行,因为它保留了保留空间的初始空白内容。我会这样做:
sed -n -r -e '/.+/x' -e '2,$H' -e '${x;p}' nums
答案 1 :(得分:1)
此sed
应该:
sed '1!G;h;$!d' file
这个:
sed -n '1!G;h;$p' file