原始文件:
# cat a.a | cat -n
1 1111111
2 2222222
3 test33333
4 444444444444
5 555555555555
G的用法: 追加保留空间内容到模式空间
另外g的用法:复制保留空间的内容到模式空间
# sed 'G' a.a | cat -n
1 1111111
2
3 2222222
4
5 test33333
6
7 444444444444
8
9 555555555555
10
解释:保留空间初始为空。模式空间读取第一行,保留空间将内容追加到模式空间去,就添加了一个空行;模式空间再读取第二行,保留空间将内容追加到模式空间中读取的第二行下面,依次类推。
p的用法: 把模式空间复制到标准输出
# sed 'G;p' a.a | cat -n
1 1111111
2
3 1111111
4
5 2222222
6
7 2222222
8
9 test33333
10
11 test33333
12
13 444444444444
14
15 444444444444
16
17 555555555555
18
19 555555555555
20
解释:结合G,更好的理解下G的空间利用。
模式空间初始为11111 ;执行G后,保留空间内容为空追加到模式空间1111下面 ,模式空间为2行,111111 和 保留空间的空行;输出 ;接着执行p ,将模式空间的2行再输出一遍。依次类推。
N的用法:读取新的输入行,将内容追加到模式空间去,开辟多行模式空间。n一次性读取模式空间,然后再读取下一行。
# sed 'N;p' a.a
1111111
2222222
1111111
2222222
test33333
444444444444
test33333
444444444444
555555555555
解释:模式空间初始内容为11111111。执行N 后,读取22222222,并追加到模式空间111111下,模式空间就有11111111 和 2222222222;输出 ;执行p,再打印一遍模式空间。
D的用法: 个人理解为 删除模式空间新加入行前面的换行符之前的内容
# sed '$!N;$!D' a.a
444444444444
555555555555
解释:模式空间初始读取第一行111111;$!N 是非末行,将其添加到模式空间,第二行匹配,读取222222 ;$!D 是非末行,删除前面的内容,就将11111111删除,此时模式空间只有2222222了;一次读取第3、4行。当读取第4行,执行完条件后,模块空间只剩444444 ;最后一行,不匹配,保留,最后只剩下4和5行。
h的用法:将模式空间的内容复制到保持空间中去
另外H:将模式空间的内容追加到保持空间去
# sed '1!G;h;$!d' a.a
555555555555
444444444444
test33333
2222222
1111111
解释: 模式空间起初为11111111 ;1!G,除第一行,其他行执行G,此时模式空间读入第二行;执行h,将22222和11111 复制到保持空间中 ;执行$!d,就是清除模式空间。接着读入第3行;执行1!G,将保留空间的内容追加到模式空间,现在模式空间为3333\n22222\n111111;执行h,将模式空间内容再复制到保持空间;执行$!d,清空保留空间。一次类推。
到读入第5行,将保留空间的内容追加到模式空间中去,模式空间为5555\n ...\n11111 ; 是最后一行,不匹配$!d,不执行。
x的用法:交换保持空间和模式空间的内容
# sed 'x;$!N;x' a.a
1111111
test33333
555555555555
解释:模式空间初始为11111;执行x,模式空间为空,保持空间为11111;执行$!N,读入22222;执行x,模式空间为111111,保持空间为22222;第一轮执行完毕,打印111。模式空间载入3333;执行x,模式空间为222222,保持空间为3333333;执行$!N,读入444444,模式空间为2222\n444444 ,保持空间不变;执行x,模式空间变为33333,保持空间变为2222\n4444;第二轮执行完毕,打印33333。模式空间载入5555555;执行x,模式空间为2222\n4444,保持空间为555555;$!N不匹配;执行x,模式空间为5555,保持空间为222\n444.
###########################
# cat a.a
1
2
3
4
5
6
7
1、打印基数行
# sed -n '1~2p' a.a 从第一行开始,步数为2
1
3
5
7
2、打印偶数行
# sed -n '2~2p' a.a 从第二行开始,步数为2
2
4
6
扩展:sed -n '2~3p' a.a / sed -n '3~3p' a.a
# cat a.a
1111111
2222222
test33333
444444444444
555555555555
# sed -n '1,+2p' a.a \\打印从第1行开始,到"1+2"结束
1111111
2222222
test33333