命令 sed '1!G;h;$!d' 如何反转文件的内容?

命令 sed '1!G;h;$!d' 如何反转文件的内容?

sed我的问题与中给出的特定解决方案有关这个答案对于这个问题反向查询。我无法破译的sed/解决方案grep如下:

sed '1!G;h;$!d' file

有人可以破译这个命令吗?

我从 VI(M) 知识中知道 G 表示文件的最后一行,而在 sed 中,一个 bang(!) 后跟一个地址,有点像grep -v这样,也就是说它不会匹配该行。但作为一个整体,上面的内联 sed 脚本超出了我的范围。

答案1

这将逐行反转文件。

sed '1!G;h;$!d'文件

首先,sed有一个保留空间和一个模式空间。在专注于该特定命令之前,我们必须区分它们。

sed读取新行时,它被加载到模式空间中。因此,每次处理新行时,该空间都会被覆盖。另一方面,保留空间在整个处理过程中是一致的,并且可以将值存储在那里以供以后使用。


到命令:

该语句中有3个命令:1!G,h$!d

  • 1!G意味着该G命令在除第一行之外的每一行上执行( 否定!1G附加将保留空间中的内容放入模式空间中。

  • h适用于每一行。它副本模式空间到保留空间(并覆盖它)。

  • $!d适用于除最后一行之外的每一行($表示最后一行,!对其取反)。d是删除线(模式空间)的命令。


  1. 现在,当读取第一行时,sed执行h命令。第一行被复制到保留空间中。然后它被删除,因为它符合$!条件。sed继续第二行。
  2. 第二行与条件匹配1!(它不是第一行),因此保留空间(具有第一行)被附加到模式空间(具有第二行)。之后,在模式空间中,现在有第二行,后面是第一行,由换行符分隔。现在,该h命令适用(就像在每一行中一样);模式空间中的所有内容都将复制到保留空间。第三条语句 ( $!d) 适用:该行从模式空间中删除。
  3. 现在所有线路均已完成第 2 步。我们跳到最后一行。
  4. 在最后一行 ( $) 中,几乎完成了步骤 2 的所有内容,但未完成删除部分 ( d)。sed,当在没有 的情况下调用时-n,会在每个输入行的处理结束时自动打印模式空间。因此,当不删除时,将打印模式空间。它现在包含中的所有行颠倒顺序

相关内容