我不明白 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
对保留空间进行一些替换。