sed笔记

sed笔记

1
2
3
4
5
6
7
8
9
10
➜  Desktop cat t.txt
111
222
333
444
555
➜ Desktop hexdump -C t.txt
00000000 31 31 31 0d 0a 32 32 32 0d 0a 33 33 33 0d 0a 34 |111..222..333..4|
00000010 34 34 0d 0a 35 35 35 0d 0a |44..555..|
00000019
1
2
3
4
5
# 效率更高
➜ Desktop sed 's/\x0d$//g' t.txt|hexdump -C
00000000 31 31 31 0a 32 32 32 0a 33 33 33 0a 34 34 34 0a |111.222.333.444.|
00000010 35 35 35 0a |555.|
00000014
1
2
3
4
➜  Desktop sed ':lable;N;s/\r\n/\n/;b lable;' t.txt |hexdump -C
00000000 31 31 31 0a 32 32 32 0a 33 33 33 0a 34 34 34 0a |111.222.333.444.|
00000010 35 35 35 0d 0a |555..|
00000015
1
2
3
4
5
6
# 二进制替换
➜ Desktop sed ':lable;N;s/\x31\x0d\x0a\x32/abc/;b lable;' t.txt
11abc22
333
444
555

lable原理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 手动添加了空行便于观察循环过程
➜ Desktop sed ':lable;N;p;b lable;' t.txt
111
222

111
222
333

111
222
333
444

111
222
333
444
555

111
222
333
444
555

b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。

总结

仅处理换行符使用sed 's/\x0d$//g'效率更高,如果需要对二进制进行补丁,替换目标中包含\n(\x0a),最好采用sed ':lable;N;s/\x31\x0d\x0a\x32/abc/;b lable