你能解释一下这个sed单行吗?

时间:2012-03-29 21:29:42

标签: linux unix sed

以下一个班轮以反向打印出文件的内容

$ sed -n '1!G;h;$p' test.txt

当sed逐行读取文件时怎么可能?你能解释一下

的含义吗?
  • n flag
  • 1!
  • G
  • h
  • $p

在这个命令中?

2 个答案:

答案 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 spacehold 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}相同。