1、概述
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
2、命令格式
sed[OPTION]... {script-only-if-no-other-script} [input-file]...
或者可以理解为:sed [options] 'AddressCommand' file ...
0、全局数据
- [oldboy@oldboy awktest]$ cat 01test
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
1、Address:匹配地址
1、number 只匹配指定的行
- [oldboy@oldboy awktest]$ sed -n '4p' 01test
- 04
2、first~step 从first开始,每次步长为step
first可以为0
- [oldboy@oldboy awktest]$ sed -n '2~3p' 01test #从第二行开始,每次步长为3
- 02
- 05
- 08
2、StartLine,EndLine 开始行到结束行
比如1,100 其中startLine最小为1不能为0
$:最后一行
- [oldboy@oldboy awktest]$ sed -n '4,6p' 01test # 4到6行
- 04
- 05
- 06
- [oldboy@oldboy awktest]$ sed -n '4,$p' 01test # 4到最后一行 $表示最后一行
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- [oldboy@oldboy awktest]$ sed -n '0,$p' 01test # 不能从0开始
- sed: -e expression #1, char 4: invalid usage of line address 0
3、/RegExp/或者\cregexpc 正则匹配
注意:\cregexpc:The c may be any character
- [root@oldboy ~]# sed -n '/root/p' /etc/passwd
- root:x:0:0:root:/root:/bin/bash
- operator:x:11:0:operator:/root:/sbin/nologin
- [root@oldboy ~]# sed -n '/^root/p' /etc/passwd # 匹配以root开头的行
- root:x:0:0:root:/root:/bin/bash
- [root@oldboy ~]# sed -n '/sync$/p' /etc/passwd # 匹配以sync结尾的行
- sync:x:5:0:sync:/sbin:/bin/sync
- [root@oldboy ~]# sed -n '\@root@p' /etc/passwd
- root:x:0:0:root:/root:/bin/bash
- operator:x:11:0:operator:/root:/sbin/nologin
- [root@oldboy ~]# sed -n '\@^root@p' /etc/passwd
- root:x:0:0:root:/root:/bin/bash
- [root@oldboy ~]# sed -n '\@sync$@p' /etc/passwd
- sync:x:5:0:sync:/sbin:/bin/sync
请认真区分上面两者的区别。
4、addr1,+N 从addr1开始,并且继续匹配下面的N行
- [oldboy@oldboy awktest]$ sed -n '2,+3p' 01test
- 02
- 03
- 04
- 05
2、Command:命令操作
Zero- or One- address commands 建议只给一个地址信息,而不是地址范围
1、= 打印当前的行 sed-n '7,${=;p}' 01test | sed -n '/^[0-9]*$/{N;s/\n/: /p}'
- [oldboy@oldboy awktest]$ sed -n '7,$=' 01test
- 7
- 8
- 9
- 10
- [oldboy@oldboy awktest]$ sed -n '7,$ {=;p}' 01test
- 7
- 07
- 8
- 08
- 9
- 09
- 10
- 10
- [oldboy@oldboy awktest]$ sed -n '7,${=;p}' 01test | sed -n '/^[0-9]*$/{N;s/\n/: /p}'
- 7: 07
- 8: 08
- 9: 09
- 10: 10
2、a \string 在指定的行后面追加新行,内容为string 【\n:可以用于换行】
- [oldboy@oldboy awktest]$ sed '6,8a \I love\nbingxing' 01test # \n 可用于换行
- 01
- 02
- 03
- 04
- 05
- 06
- I love
- bingxing
- 07
- I love
- bingxing
- 08
- I love
- bingxing
- 09
- 10
3、i \string 在指定的行前面插入新行,内容为string 【\n:可以用于换行】
- [oldboy@oldboy awktest]$ sed '6,8i \I love\nbingxing' 01test
- 01
- 02
- 03
- 04
- 05
- I love
- bingxing
- 06
- I love
- bingxing
- 07
- I love
- bingxing
- 08
- 09
- 10
4、q [exit-code] 和Q [exit-code]
注意下面的区别:
- [oldboy@oldboy awktest]$ sed '4q' 01test # 到第4行退出
- 01
- 02
- 03
- 04
- [oldboy@oldboy awktest]$ sed '4,6q' 01test # 只接受一个地址信息
- sed: -e expression #1, char 4: command only uses one address
- [oldboy@oldboy awktest]$ sed '4Q' 01test # 到第4行的前一行退出
- 01
- 02
- 03
- [oldboy@oldboy awktest]$ sed '4,5Q' 01test # 只接受一个地址信息
- sed: -e expression #1, char 4: command only uses one address
5、r filename 从filename读取并追加文件
- [oldboy@oldboy awktest]$ cat test
- zhanglaing
- bingxing
- [oldboy@oldboy awktest]$ sed '3,5r test' 01test # 在匹配的地方追加信息
- 01
- 02
- 03
- zhanglaing
- bingxing
- 04
- zhanglaing
- bingxing
- 05
- zhanglaing
- bingxing
- 06
- 07
- 08
- 09
- 10
6、R filename 从filename追加文本信息,每次追加一行
- [oldboy@oldboy awktest]$ cat test
- zhanglaing
- bingxing
- [oldboy@oldboy awktest]$ sed '3,5R test' 01test # 每n次匹配,追加test文件的第n行信息
- 01
- 02
- 03
- zhanglaing # 第一次,追加第一行
- 04
- bingxing # 第二次,追加第二行
- 05
- 06
- 07
- 08
- 09
- 10
Commands which accept address ranges 直接地址范围
1、c \string 替换匹配的行,内容为string 【\n:可以用于换行】
- [oldboy@oldboy awktest]$ sed '3,5c \zhang\nliang' 01test # 3到5行被替换
- 01
- 02
- zhang
- liang
- 06
- 07
- 08
- 09
- 10
2、d 删除模式空间内容,开始下次循环
- [oldboy@oldboy awktest]$ sed '3,5d' 01test # 3到5行被删除
- 01
- 02
- 06
- 07
- 08
- 09
- 10
3、l 列出当前行的所有信息 【小写的L】
- [oldboy@oldboy awktest]$ sed -n '3,5l' 01test
- 03$
- 04$
- 05$
4、l width 列出当前行的所有信息,宽度为 width
- [oldboy@oldboy awktest]$ sed -n '3,5l 2' 01test
- 0\
- 3$
- 0\
- 4$
- 0\
- 5$
5、p 打印当前的模式空间
- [oldboy@oldboy awktest]$ sed -n '2,5p' 01test
- 02
- 03
- 04
- 05
6、s/regexp/replacement/ 也可以为 s@@@ s###
默认只替换每行中第一次被模式匹配到的字符串 【前面是正则,后面是字符串】
加修饰符
g: 全局替换 s/pattern/string/g【修饰符】
i: 忽略字符大小写 s/pattern/string/i【修饰符】
s///: s###, s@@@ 效果一样 【\(\), \1, \2 分组】【& 引用模式匹配整个串,即 regexp部分】
示例1
- [oldboy@moban ~]$ cat /etc/fstab
- UUID=67be2fce-cfc2-4e9e-ae0f-47d70d2d4bad /boot ext4 defaults 1 2
- tmpfs /dev/shm tmpfs defaults 0 0
- devpts /dev/pts devpts gid=5,mode=620 0 0
- [oldboy@moban ~]$ sed 's@/@##@' /etc/fstab # 只匹配匹配行第一次出现时,不是全局匹配
- UUID=67be2fce-cfc2-4e9e-ae0f-47d70d2d4bad ##boot ext4 defaults 1 2
- tmpfs ##dev/shm tmpfs defaults 0 0
- devpts ##dev/pts devpts gid=5,mode=620 0 0
- [oldboy@moban ~]$ sed 's@/@##@g' /etc/fstab
- UUID=67be2fce-cfc2-4e9e-ae0f-47d70d2d4bad ##boot ext4 defaults 1 2
- tmpfs ##dev##shm tmpfs defaults 0 0
- devpts ##dev##pts devpts gid=5,mode=620 0 0
- [oldboy@moban ~]$
- [oldboy@moban ~]$ sed 's@u@##@g' /etc/fstab
- UUID=67be2fce-cfc2-4e9e-ae0f-47d70d2d4bad /boot ext4 defa##lts 1 2
- tmpfs /dev/shm tmpfs defa##lts 0 0
- devpts /dev/pts devpts gid=5,mode=620 0 0
- [oldboy@moban ~]$ sed 's@u@##@gi' /etc/fstab # i 忽略大小写
- ####ID=67be2fce-cfc2-4e9e-ae0f-47d70d2d4bad /boot ext4 defa##lts 1 2
- tmpfs /dev/shm tmpfs defa##lts 0 0
- devpts /dev/pts devpts gid=5,mode=620 0 0
示例2
l..e: like-->liker
love-->lover
like-->Like
love-->Love
- [oldboy@moban sed]$ cat sed2
- hello, like
- hi, my love
- [oldboy@moban sed]$ sed 's/l..e/l..er/' sed2
- hello, l..er
- hi, my l..er
- [oldboy@moban sed]$ sed 's/l..e/&r/' sed2 # 使用了 &
- hello, liker
- hi, my lover
- [oldboy@moban sed]$ sed 's/\(l..e\)/\1r/' sed2 # 使用了向后引用 或者扩展正则: sed -r 's/(l..e)/\1r/' sed2
- hello, liker
- hi, my lover
7、w filename 将模式空间匹配的内容,写到filename 中
- [oldboy@oldboy awktest]$ sed -n '3,6w test01' 01test
- [oldboy@oldboy awktest]$ cat test01
- 03
- 04
- 05
- 06
3、常用命令选项
-n, --quiet, --silent 抑制模式空间的自动打印
- [oldboy@oldboy awktest]$ sed '3,6p' 01test
- 01
- 02
- 03
- 03
- 04
- 04
- 05
- 05
- 06
- 06
- 07
- 08
- 09
- 10
- [oldboy@oldboy awktest]$ sed -n '3,6p' 01test
- 03
- 04
- 05
- 06
-e script,--expression=script 将脚本添加到要执行的命令。允许多点编辑。
- [oldboy@moban sed]$ cat sed1
- qwewq
- wetwdgh
- 5555
- zhang liang
- werwet bbb
- ewtew 123
- ettte
- [oldboy@moban sed]$ sed -e '1,3d' sed1
- zhang liang
- werwet bbb
- ewtew 123
- ettte
- [oldboy@moban sed]$ sed -e '1,3d' -e 's/zhang/bing/' sed1 # 第一个是删除1到3行,第二个是将'zhang'替换为'bing'
- bing liang
- werwet bbb
- ewtew 123
- ettte
-f script-file, --file=script-file 添加脚本文件内容到将要执行的命令。示例如下
- [oldboy@moban sed]$ cat script1 # 没有引号
- 1,3d # 删除1到3行
- s/zhang/bing/ # 每行中把 zhang 替换为 bing
- /liang/p
- [oldboy@moban sed]$ cat sed1
- qwewq
- wetwdgh
- 5555
- zhang liang
- werwet bbb
- ewtew 123
- ettte
- [oldboy@moban sed]$ sed -f ./script1 sed1
- bing liang
- bing liang
- werwet bbb
- ewtew 123
- ettte
- [oldboy@oldboy awktest]$ sed -n -f script1 sed1
- bing liang
-i[SUFFIX],--in-place[=SUFFIX] 直接修改读取的档案内容,而不是由屏幕输出。
- [oldboy@oldboy awktest]$ cat sed2
- zhang liang
- werwet bbb
- [oldboy@oldboy awktest]$ sed -i 's#bbb#bingxing#g' sed2
- [oldboy@oldboy awktest]$ cat sed2
- zhang liang
- werwet bingxing
--posix 禁用所有的GNU扩展。
-r, --regexp-extended 在脚本中使用扩展正则表达式。
4、常用示例
暂无
请参见另一篇博文
5、命令所在位置和类型
- [root@oldboy ~]# which sed
- /bin/sed
- [root@oldboy ~]# type sed
- sed is /bin/sed