sed笔记
| ➜ 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
|
| ➜ 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
|
| ➜ 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
|
| # 二进制替换 ➜ 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