当在保持缓冲区和模式缓冲区之间交换数据时,sed 的 x 选项实际上做了什么?

当在保持缓冲区和模式缓冲区之间交换数据时,sed 的 x 选项实际上做了什么?

我不明白 x 在交换保持和模式缓冲区的内容时做什么。它是否在保持和模式之间交换数据,以便删除保持或模式中的任何先前数据?到底发生了什么?

答案1

也许解释这些的最好方法就是翻译成更详细的语言,比如perl.在 中sed,保持空间就像一个用空行初始化的静态变量,而模式空间是一个sed依次分配给每一行输入的变量。就像是:

$hold_space = "\n";
LINE: while ($pattern_space = <>) {

  <sed commands go here>

  print $pattern_space; # unless -n option is passed
}

x交换模式和保持空间,它就做到了这一点。

($pattern_space, $hold_space) = ($hold_space, $pattern_space);

现在,保留空间包含模式空间所包含的内容(当前输入行,除非任何其他命令修改了它)。并且模式空间被替换为保持空间包含的任何内容,因此将在处理下一行输入之前在末尾输出(其中模式空间将被分配给新的输入行)。

模式空间就是您所处理的内容。因此,如果您想用其中的数据做任何事情,就需要其中的数据。保留空间是一个存储区域,如果您需要在处理两行输入之间保留数据,则可以使用该区域。

g将保留空间放入模式空间,但随后会丢失原始模式空间。x,在保留空间中保留旧的模式空间。例如,要编辑保留空间,您可以x;s/.../.../;x对保留空间进行一些替换。

相关内容