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
6、另请参见