答案1
这将逐行反转文件。
sed '1!G;h;$!d'文件
首先,sed
有一个保留空间和一个模式空间。在专注于该特定命令之前,我们必须区分它们。
当sed
读取新行时,它被加载到模式空间中。因此,每次处理新行时,该空间都会被覆盖。另一方面,保留空间在整个处理过程中是一致的,并且可以将值存储在那里以供以后使用。
到命令:
该语句中有3个命令:1!G
,h
和$!d
1!G
意味着该G
命令在除第一行之外的每一行上执行( 否定!
)1
。G
指附加将保留空间中的内容放入模式空间中。h
适用于每一行。它副本模式空间到保留空间(并覆盖它)。$!d
适用于除最后一行之外的每一行($
表示最后一行,!
对其取反)。d
是删除线(模式空间)的命令。
- 现在,当读取第一行时,
sed
执行h
命令。第一行被复制到保留空间中。然后它被删除,因为它符合$!
条件。sed
继续第二行。 - 第二行与条件匹配
1!
(它不是第一行),因此保留空间(具有第一行)被附加到模式空间(具有第二行)。之后,在模式空间中,现在有第二行,后面是第一行,由换行符分隔。现在,该h
命令适用(就像在每一行中一样);模式空间中的所有内容都将复制到保留空间。第三条语句 ($!d
) 适用:该行从模式空间中删除。 - 现在所有线路均已完成第 2 步。我们跳到最后一行。
- 在最后一行 (
$
) 中,几乎完成了步骤 2 的所有内容,但未完成删除部分 (d
)。sed
,当在没有 的情况下调用时-n
,会在每个输入行的处理结束时自动打印模式空间。因此,当不删除时,将打印模式空间。它现在包含中的所有行颠倒顺序。