一、sed介绍
sed 是一种新型的,非交互式的编辑器。它能执行与编辑器 vi 和 ex 相同的编辑任务。sed 编辑器没有提供交互式使用方式,使用者只能在命令行输入编辑命令、指定文件名,然后在屏幕上查看输出。 sed 编辑器没有破坏性,它不会修改文件,除非使用 shell 重定向来保存输出结果。默认情况下,所有的输出行都被打印到屏幕上。
sed 编辑器逐行处理文件(或输入),并将输出结果发送到屏幕。 sed 的命令就是在 vi和 ed/ex 编辑器中见到的那些。 sed 把当前正在处理的行保存在一个临时缓存区中,这个缓存区称为模式空间或临时缓冲。sed 处理完模式空间中的行后(即在该行上执行 sed 命令后),就把改行发送到屏幕上(除非之前有命令删除这一行或取消打印操作)。 sed 每处理完输入文件的最后一行后, sed 便结束运行。 sed 把每一行都存在临时缓存区中,对这个副本进行编辑,所以不会修改或破坏源文件。如图 1: sed 处理过程。
二、sed命令使用示例
为了演示sed命令,临时创建test.txt文件,内容如下。
(base) [[email protected] ~]# ll /usr/ > test.txt
(base) [[email protected] ~]# cat test.txt
total 272
dr-xr-xr-x. 2 root root 49152 Jan 17 05:09 bin
drwxr-xr-x. 2 root root 6 Apr 10 2018 etc
drwxr-xr-x. 2 root root 6 Apr 10 2018 games
drwxr-xr-x. 40 root root 8192 Dec 15 22:02 include
dr-xr-xr-x. 43 root root 4096 Dec 15 22:03 lib
dr-xr-xr-x. 143 root root 81920 Jan 16 06:56 lib64
drwxr-xr-x. 49 root root 12288 Dec 15 22:03 libexec
drwxr-xr-x. 12 root root 131 Dec 15 21:59 local
dr-xr-xr-x. 2 root root 20480 Jan 16 06:56 sbin
drwxr-xr-x. 235 root root 8192 Jan 16 06:56 share
drwxr-xr-x. 4 root root 34 Dec 15 21:59 src
lrwxrwxrwx. 1 root root 10 Dec 15 21:59 tmp -> …/var/tmp
1、打印匹配的行
(base) [[email protected] ~]# sed -n ‘/lib/p’ test.txt
dr-xr-xr-x. 43 root root 4096 Dec 15 22:03 lib
dr-xr-xr-x. 143 root root 81920 Jan 16 06:56 lib64
drwxr-xr-x. 49 root root 12288 Dec 15 22:03 libexec
2、替换指定的行
(base) [[email protected] ~]# sed ‘s/include/test2/g’ test.txt
total 272
dr-xr-xr-x. 2 root root 49152 Jan 17 05:09 bin
drwxr-xr-x. 2 root root 6 Apr 10 2018 etc
drwxr-xr-x. 2 root root 6 Apr 10 2018 games
drwxr-xr-x. 40 root root 8192 Dec 15 22:02 test2
dr-xr-xr-x. 43 root root 4096 Dec 15 22:03 lib
dr-xr-xr-x. 143 root root 81920 Jan 16 06:56 lib64
drwxr-xr-x. 49 root root 12288 Dec 15 22:03 libexec
drwxr-xr-x. 12 root root 131 Dec 15 21:59 local
dr-xr-xr-x. 2 root root 20480 Jan 16 06:56 sbin
drwxr-xr-x. 235 root root 8192 Jan 16 06:56 share
drwxr-xr-x. 4 root root 34 Dec 15 21:59 src
lrwxrwxrwx. 1 root root 10 Dec 15 21:59 tmp -> …/var/tmp
3、删除指定行
删除的行号含,例如‘10,13d’删除了第10号至第13行。
(base) [[email protected] ~]# sed ‘10,13d’ test.txt
total 272
dr-xr-xr-x. 2 root root 49152 Jan 17 05:09 bin
drwxr-xr-x. 2 root root 6 Apr 10 2018 etc
drwxr-xr-x. 2 root root 6 Apr 10 2018 games
drwxr-xr-x. 40 root root 8192 Dec 15 22:02 include
dr-xr-xr-x. 43 root root 4096 Dec 15 22:03 lib
dr-xr-xr-x. 143 root root 81920 Jan 16 06:56 lib64
drwxr-xr-x. 49 root root 12288 Dec 15 22:03 libexec
drwxr-xr-x. 12 root root 131 Dec 15 21:59 local
(base) [[email protected] ~]# sed ‘5,$d’ test.txt
total 272
dr-xr-xr-x. 2 root root 49152 Jan 17 05:09 bin
drwxr-xr-x. 2 root root 6 Apr 10 2018 etc
drwxr-xr-x. 2 root root 6 Apr 10 2018 games
4、匹配字符串的行行尾添加指定内容
(base) [[email protected] ~]# sed ‘/^dr-/ s/$/可读目录/’ test.txt
total 272
dr-xr-xr-x. 2 root root 49152 Jan 17 05:09 bin可读目录
drwxr-xr-x. 2 root root 6 Apr 10 2018 etc
drwxr-xr-x. 2 root root 6 Apr 10 2018 games
drwxr-xr-x. 40 root root 8192 Dec 15 22:02 include
dr-xr-xr-x. 43 root root 4096 Dec 15 22:03 lib可读目录
dr-xr-xr-x. 143 root root 81920 Jan 16 06:56 lib64可读目录
drwxr-xr-x. 49 root root 12288 Dec 15 22:03 libexec
drwxr-xr-x. 12 root root 131 Dec 15 21:59 local
dr-xr-xr-x. 2 root root 20480 Jan 16 06:56 sbin可读目录
drwxr-xr-x. 235 root root 8192 Jan 16 06:56 share
drwxr-xr-x. 4 root root 34 Dec 15 21:59 src
lrwxrwxrwx. 1 root root 10 Dec 15 21:59 tmp -> …/var/tmp
5、匹配字符串的位置后添加指定内容
(base) [[email protected] ~]# sed ‘s/^dr-/&可读目录/’ test.txt
total 272
dr-可读目录xr-xr-x. 2 root root 49152 Jan 17 05:09 bin
drwxr-xr-x. 2 root root 6 Apr 10 2018 etc
drwxr-xr-x. 2 root root 6 Apr 10 2018 games
drwxr-xr-x. 40 root root 8192 Dec 15 22:02 include
dr-可读目录xr-xr-x. 43 root root 4096 Dec 15 22:03 lib
dr-可读目录xr-xr-x. 143 root root 81920 Jan 16 06:56 lib64
drwxr-xr-x. 49 root root 12288 Dec 15 22:03 libexec
drwxr-xr-x. 12 root root 131 Dec 15 21:59 local
dr-可读目录xr-xr-x. 2 root root 20480 Jan 16 06:56 sbin
drwxr-xr-x. 235 root root 8192 Jan 16 06:56 share
drwxr-xr-x. 4 root root 34 Dec 15 21:59 src
lrwxrwxrwx. 1 root root 10 Dec 15 21:59 tmp -> …/var/tmp
6、打印指定行开始开始匹配字符串的之间的行
(base) [[email protected] ~]# sed -n ‘5,/drwxr/p’ test.txt
7、多重编辑
(base) [[email protected] ~]# sed -e ‘1,5d’ -e ‘s/sbin/stestttttttt/g’ test.txt
dr-xr-xr-x. 43 root root 4096 Dec 15 22:03 lib
dr-xr-xr-x. 143 root root 81920 Jan 16 06:56 lib64
drwxr-xr-x. 49 root root 12288 Dec 15 22:03 libexec
drwxr-xr-x. 12 root root 131 Dec 15 21:59 local
dr-xr-xr-x. 2 root root 20480 Jan 16 06:56 stestttttttt
drwxr-xr-x. 235 root root 8192 Jan 16 06:56 share
drwxr-xr-x. 4 root root 34 Dec 15 21:59 src
lrwxrwxrwx. 1 root root 10 Dec 15 21:59 tmp -> …/var/tmp
8、内容追加
(base) [[email protected] ~]# sed ‘/^lrw/a this is add something!’ test.txt
total 272
dr-xr-xr-x. 2 root root 49152 Jan 17 05:09 bin
drwxr-xr-x. 2 root root 6 Apr 10 2018 etc
drwxr-xr-x. 2 root root 6 Apr 10 2018 games
drwxr-xr-x. 40 root root 8192 Dec 15 22:02 include
dr-xr-xr-x. 43 root root 4096 Dec 15 22:03 lib
dr-xr-xr-x. 143 root root 81920 Jan 16 06:56 lib64
drwxr-xr-x. 49 root root 12288 Dec 15 22:03 libexec
drwxr-xr-x. 12 root root 131 Dec 15 21:59 local
dr-xr-xr-x. 2 root root 20480 Jan 16 06:56 sbin
drwxr-xr-x. 235 root root 8192 Jan 16 06:56 share
drwxr-xr-x. 4 root root 34 Dec 15 21:59 src
lrwxrwxrwx. 1 root root 10 Dec 15 21:59 tmp -> …/var/tmp
this is add something!
9、直接修改当前文档
使用-i参数直接更新当前文档。
(base) [[email protected] ~]# sed -i ‘s/lib/libbbbbbbb/g’ test.txt
(base) [[email protected] ~]# cat test.txt
total 272
dr-xr-xr-x. 2 root root 49152 Jan 17 05:09 bin
drwxr-xr-x. 2 root root 6 Apr 10 2018 etc
drwxr-xr-x. 2 root root 6 Apr 10 2018 games
drwxr-xr-x. 40 root root 8192 Dec 15 22:02 include
dr-xr-xr-x. 43 root root 4096 Dec 15 22:03 libbbbbbbb
dr-xr-xr-x. 143 root root 81920 Jan 16 06:56 libbbbbbbb64
drwxr-xr-x. 49 root root 12288 Dec 15 22:03 libbbbbbbbexec
drwxr-xr-x. 12 root root 131 Dec 15 21:59 local
dr-xr-xr-x. 2 root root 20480 Jan 16 06:56 sbin
drwxr-xr-x. 235 root root 8192 Jan 16 06:56 share
drwxr-xr-x. 4 root root 34 Dec 15 21:59 src
lrwxrwxrwx. 1 root root 10 Dec 15 21:59 tmp -> …/var/tmp
10、直接修改匹配行为指定内容
(base) [[email protected] ~]# sed ‘/src$/c this is src’ test.txt
total 272
dr-xr-xr-x. 2 root root 49152 Jan 17 05:09 bin
drwxr-xr-x. 2 root root 6 Apr 10 2018 etc
drwxr-xr-x. 2 root root 6 Apr 10 2018 games
drwxr-xr-x. 40 root root 8192 Dec 15 22:02 include
dr-xr-xr-x. 43 root root 4096 Dec 15 22:03 libbbbbbbb
dr-xr-xr-x. 143 root root 81920 Jan 16 06:56 libbbbbbbb64
drwxr-xr-x. 49 root root 12288 Dec 15 22:03 libbbbbbbbexec
drwxr-xr-x. 12 root root 131 Dec 15 21:59 local
dr-xr-xr-x. 2 root root 20480 Jan 16 06:56 sbin
drwxr-xr-x. 235 root root 8192 Jan 16 06:56 share
this is src
lrwxrwxrwx. 1 root root 10 Dec 15 21:59 tmp -> …/var/tmp
11、字符转换
字符按照一对一的方式从左到右进行转换。例如 y/abc/ABC/,会把小写字母转换成大写字母, a–>A,b–>B,c–>C。
(base) [[email protected] ~]# sed ‘1,13y/drwx/DRWX/’ test.txt
total 272
DR-XR-XR-X. 2 Root Root 49152 Jan 17 05:09 bin
DRWXR-XR-X. 2 Root Root 6 ApR 10 2018 etc
DRWXR-XR-X. 2 Root Root 6 ApR 10 2018 games
DRWXR-XR-X. 40 Root Root 8192 Dec 15 22:02 incluDe
DR-XR-XR-X. 43 Root Root 4096 Dec 15 22:03 libbbbbbbb
DR-XR-XR-X. 143 Root Root 81920 Jan 16 06:56 libbbbbbbb64
DRWXR-XR-X. 49 Root Root 12288 Dec 15 22:03 libbbbbbbbeXec
DRWXR-XR-X. 12 Root Root 131 Dec 15 21:59 local
DR-XR-XR-X. 2 Root Root 20480 Jan 16 06:56 sbin
DRWXR-XR-X. 235 Root Root 8192 Jan 16 06:56 shaRe
DRWXR-XR-X. 4 Root Root 34 Dec 15 21:59 sRc
lRWXRWXRWX. 1 Root Root 10 Dec 15 21:59 tmp -> …/vaR/tmp
三、sed命令参数详解
1、sed 命令的基本格式
#sed [选项] [脚本命令] 文件名
(base) [[email protected] ~]# sed --help
Usage: sed [OPTION]… {script-only-if-no-other-script} [input-file]…
2、参数说明
- -e<script>或–expression=<script> 以选项中指定的script来处理输入的文本文件。
- -f<script文件>或–file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
- -h或–help 显示帮助。
- -n或–quiet或–silent 仅显示script处理后的结果。
- -V或–version 显示版本信息。
3、动作说明
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
- s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
4、sed常用命令
- a\ 在当前行下面插入文本;
- i\ 在当前行上面插入文本;
- c\ 把选定的行改为新的文本;
- d 删除,删除选择的行;
- D 删除模板块的第一行;
- s 替换指定字符;
- h 拷贝模板块的内容到内存中的缓冲区;
- H 追加模板块的内容到内存中的缓冲区;
- g 获得内存缓冲区的内容,并替代当前模板块中的文本;
- G 获得内存缓冲区的内容,并追加到当前模板块文本的后面;
- l 列表不能打印字符的清单;
- n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令;
- N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码;
- p 打印模板块的行。 P(大写) 打印模板块的第一行;
-
q 退出Sed;
b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾;
- r file 从file中读行;
- t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾;
- T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾;
- w file 写并追加模板块到file末尾;
- W file 写并追加模板块的第一行到file末尾;
- ! 表示后面的命令对所有没有被选定的行发生作用;
- = 打印当前行号;
- # 把注释扩展到下一个换行符以前;
5、sed替换标记
- g 表示行内全面替换;
- p 表示打印行;
- w 表示把行写入一个文件;
- x 表示互换模板块中的文本和缓冲区中的文本;
- y 表示把一个字符翻译为另外的字符(但是不用于正则表达式);
- \1 子串匹配标记;
- & 已匹配字符串标记;
6、sed元字符集
- ^ 匹配行开始,如:/^sed/匹配所有以sed开头的行;
- $ 匹配行结束,如:/sed$/匹配所有以sed结尾的行;
- . 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d;
- \ * 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行;
- \ [] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed;
- [^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行;
- \(…\) 匹配子串,保存匹配的字符,如s/(love)able/\1rs,loveable被替换成lovers;
- & 保存搜索字符用来替换其他字符,如s/love/&/,love这成love;
- \< 匹配单词的开始,如:/\
- \> 匹配单词的结束,如/love>/匹配包含以love结尾的单词的行;
- x\{m\} 重复字符x,m次,如:/0{5}/匹配包含5个0的行;
- x\{m,\} 重复字符x,至少m次,如:/0{5,}/匹配至少有5个0的行;
- x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0{5,10}/匹配5~10个0的行;