#sed.txt文件内容
#cat sed.txt
a
b
aa
bb
#sed ‘/a/{h;d};/b/G’ sed.txt
#sed.txt文件内容
#cat sed.txt
a
b
aa
bb
#sed ‘/a/{h;d};/b/G’ sed.txt
三、最后一行line 5执行N没有内容可读,直接打印该行。
h、H、g、G、x这几个命令都是用于模式空间和保持空间转换的。这里有必要解释一下模式空间和保持空间了:
模式空间——容纳当前输入行的缓冲区。
除了h/H/g/G/x,其他所有sed命令都是针对模式空间的内容进行处理的!
保持空间——模式空间以外的一个预留缓冲区。
只有h/H/g/G/x命令可以访问到保持空间的内容,并用于与模式空间内容的转换。
h:将模式空间的内容复制到保持空间,类似与重定向符号>,会覆盖原由保持空间内容
H:将模式空间的内容追加到保持空间,类似与追加重定向>>,追加到保持空间的尾行下
g:类似h,将保持空间的内容复制到模式空间
G:类似H,将保持空间的内容追加到模式空间
x:交换模式空间与保持空间中的内容
$ cat file
1
2
11
22
$ sed ‘/1/{h;d};/2/G’ file
2
1
22
11
这个sed命令完成了反转的功能,我们来看看是怎么实现的:
一、/1/{h;d}命令搜索模式空间包含1的行然后先后执行h和d命令。结果首行1将被应用,h把该行(内容为1)复制到保持空间,此时模式空间和保持空间中的内容为:
模式空间:1
保持空间:1
接着执行d,d不能访问保持空间,只处理模式空间的内容,将模式空间的内容删除,此时:
模式空间: (空,没有内容)
保持空间:1
二、d命令执行完之后,执行/2/G,即在模式空间搜索包含2的行进行G处理,而此时模式空间无内容,所以不做任何操作。
三、读取下一行文本到模式空间,继续执行’/1/{h;d};/2/G’。下一行文本的内容是2,此时:
模式空间:2
保持空间:1
与步骤二的道理相同,h、d得不到执行(因为模式可空间没找到包含1的行);而’/2/G’将被执行,将保持空间的内容追加到模式空间后面,此时:
模式空间:2
1
保持空间:1
这一步完成以后,模式空间的内容将被sed默认地打印出来(如果有-n参数才不打印),于是前两行处理完之后,将输出:
2
1
同理,后两行处理完之后,将输出:
22
11
于是,我们看到了最后的结果:
2
1
22
11