天天看点

Linux命令之sed命令详解一、sed介绍二、sed命令使用示例三、sed命令参数详解

一、sed介绍

  sed 是一种新型的,非交互式的编辑器。它能执行与编辑器 vi 和 ex 相同的编辑任务。sed 编辑器没有提供交互式使用方式,使用者只能在命令行输入编辑命令、指定文件名,然后在屏幕上查看输出。 sed 编辑器没有破坏性,它不会修改文件,除非使用 shell 重定向来保存输出结果。默认情况下,所有的输出行都被打印到屏幕上。

  sed 编辑器逐行处理文件(或输入),并将输出结果发送到屏幕。 sed 的命令就是在 vi和 ed/ex 编辑器中见到的那些。 sed 把当前正在处理的行保存在一个临时缓存区中,这个缓存区称为模式空间或临时缓冲。sed 处理完模式空间中的行后(即在该行上执行 sed 命令后),就把改行发送到屏幕上(除非之前有命令删除这一行或取消打印操作)。 sed 每处理完输入文件的最后一行后, sed 便结束运行。 sed 把每一行都存在临时缓存区中,对这个副本进行编辑,所以不会修改或破坏源文件。如图 1: sed 处理过程。

Linux命令之sed命令详解一、sed介绍二、sed命令使用示例三、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
Linux命令之sed命令详解一、sed介绍二、sed命令使用示例三、sed命令参数详解

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的行;

继续阅读