以下一个班轮以反向打印出文件的内容
$ sed -n '1!G;h;$p' test.txt
当sed逐行读取文件时怎么可能?你能解释一下
的含义吗?n
flag 1!
G
h
$p
在这个命令中?
答案 0 :(得分:6)
这将执行与tac
相同的工作,即恢复行的顺序。
将sed脚本重写为伪代码,意味着:
$line_number = 1;
foreach ($input in $input_lines) {
// current input line is in $input
if ($line_number != 1) // 1!
$input = $input + '\n' + $hold; // G
$hold = $input; // h
$line_number++
}
print $input; // $p
正如您所看到的,sed语言非常具有表现力:-) 1!
和$
是所谓的地址,它们应该在运行命令时设置条件。 1!
表示不在第一行,$
表示结尾。 Sed有一个辅助内存寄存器,称为hold space
。
有关更多信息,请在linux控制台上输入info sed
(这是最好的文档)。
-n
在循环中禁用默认的print $input
命令。
在此示例中,术语pattern space
和hold space
分别等同于变量$input
和$hold
。
答案 1 :(得分:5)
n flag -> Disable auto-printing.
1! -> Any line except the first one.
G -> Append a newline and content of 'hold space' to 'pattern space'
h -> Replace content of 'hold space' with content of 'pattern space'
$ -> Last line.
p -> print
所以,这意味着:根据我的理解,反转文件的内容。
编辑添加一些解释(感谢 potong ,请参阅他对原始评论的评论):
1
和$
等地址绑定到下一个命令,使用{...}
分组或不使用它们。因此,在这种情况下,1!
适用于G
和$
适用于p
,而h
未附加到地址并适用于所有地址。那是$!G
和$!{G}
相同。