不看绝对后悔的Linux三剑客之sed实战精讲

第1章 sed基础

第1章 sed知识点

不看绝对后悔的Linux三剑客之sed实战精讲

原文:

1.1 sed的选项  stream editor 流编辑器

 -r              支持扩展正则

 -n              取消默认输出

 -i               直接修改不输出到桌面

 -i.bak        备份

1.1 sed是什么

二、Linux三剑客之sed命令精讲

 

1.2 sed的书写格式

sed    '条件命令'

sed      'pattern命令'

sed      '模式命令'

字符流编辑器 Stream Editor

1,前言

  • 我们都知道,在Linux中一切皆文件,比如配置文件,日志文件,启动文件等等。如果我们相对这些文件进行一些编辑查询等操作时,我们可能会想到一些vi,vim,cat,more等命令。但是这些命令效率不高,这就好比一块空地准备搭建房子,请了10个师傅拿着铁锹挖地基,花了一个月的时间才挖完,而另外一块空地则请了个挖土机,三下五除二就搞定了,这就是效率。而在linux中的“挖土机”有三种型号:顶配awk,中配sed,标配grep。使用这些工具,我们能够在达到同样效果的前提下节省大量的重复性工作,提高效率。

  • 接下来我们就看一下sed的详细说明

  • sed 是Stream Editor(字符流编辑器)的缩写,简称流编辑器。什么是流?大家可以想象以下流水线,sed就像一个车间一样,文件中的每行字符都是原料,运到sed车间,然后经过一系列的加工处理,最后从流水线下来就变成货物了。

2,软件功能与版本

  • Sed命令是操作,过滤和转换文本内容的强大工具。常用功能有增删改查(增加,删除,修改,查询),其中查询的功能中最常用的2大功能是过滤(过滤指定字符串),取行(取出指定行)。

  • 我们现在准备学习的sed版本是GNU开源版本的,我的实验环境是CentOS6.8系统,内核版本是2.6.32-642.el6.x86_64

3,语法格式

sed [options] [sed -commands][input -file]
sed [选项]  【sed命令】 【输入文件】

1.3 sed命令执行过程

1.读取文件内容第1行

2.是否满足条件

     1).满足条件 执行对应的命令 p  s  d 

     2).不满足   继续第1步

3.截止到文件的最后一行

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。

4,命令执行流程

文件person.txt在模式空间的完整处理流程

1,判断第1行是否是需要处理的行,如果不是要处理的行就重新从文件读取下一行,如果是要处理的行,则接着往下走。
2,对模式空间的内容执行sed命令,比如a(追加),i(插入),s(替换)...
3,将模式空间中经过sed命令处理后的内容输出到屏幕上,然后清空模式空间
4,读取下一行文本,然后重新执行上面的流程,直到文件结束

第2章 sed命令的使用

sed增删改查   不加i选项只会把修改内容输出到并没有真正修改,加上i选项会直接修改文件内容

1.2 sed功能与版本

1)处理纯文本文件,日志,配置文件等==>Linux

2)增加、删除、修改、查询

3)sed --version

[root@oldboyedu43 ~]# sed --version

GNU sed version 4.2.1

Copyright (C) 2009 Free Software Foundation, Inc.

This is free software; see the source for copying conditions.  There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,

to the extent permitted by law.

 

GNU sed home page: <http://www.gnu.org/software/sed/>.

General help using GNU software: <http://www.gnu.org/gethelp/>.

E-mail bug reports to: <bug-gnu-utils@gnu.org>.

Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.

1.3 语法格式

sed [选项] [sed指令] [输入文件]

sed -i.bak 's#oldboy#oldgirl#g' oldboy.txt

-i  ----sed命令的参数

s ---sed指令

g ---小尾巴/修饰

5,选项说明

option[选项] 解释说明(带*的为重点)
-n 取消默认的sed软件的输出,常与sed命令的p连用。*
-e 一行命令语句可以执行多条sed命令
-f 选项后面可以接sed脚本的文件名
-r 使用扩展正则表达式,默认情况sed只识别基本正则表达式*
-i 直接修改文件内容,而不是输出到终端,如果不使用-i选项sed软件只是修改在内存中的数据,并不会影响磁盘上的文件*

图片 1

图片 2

2.1 sed 增加  cai

c   replace 替换

a   append 追加

i   insert 插入

1.4 sed 命令运行过程

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。

6,使用范例

2.1.1 在person.txt文件第三行下追加12306,xiao,UFO

查看person.txt文件

[root@zeq lx]# cat person.txt

101,zeq,CEO

102,zhang,CTO

103,Love,COO

104,yy,CFO

105,faker,CIO

110,ahao,COCO

第三行下追加12306,xiao,UFO

[root@zeq lx]# sed '3a12306,xiao,UFO' person.txt      a追加,3a在第三行下追加

101,zeq,CEO

102,zhang,CTO

103,Love,COO

12306,xiao,UFO

104,yy,CFO

105,faker,CIO

110,ahao,COCO

第2章 查询 p(print)

6.1 统一实验文本

[root@chensiqi1 ~]# cat >person.txt<<KOF

> 101,chensiqi,CEO

> 102,zhangyang,CTO

> 103,Alex,COO

> 104,yy,CFO

> 105,feixue,CIO

> KOF          #KOF必须成对出现,表示终止输入

 

2.1.2 在person.txt文件第三行上插入12306,xiao,UFO

[root@zeq lx]# sed '3i12306,xiao,UFO' person.txt

101,zeq,CEO

102,zhang,CTO

12306,xiao,UFO

103,Love,COO

104,yy,CFO

105,faker,CIO

110,ahao,COCO

2.1 按行查询

6.2 常用功能-增删改查

2.1.3 把person.txt文件第三行替换成12306,xiao,UFO

[root@zeq lx]# sed '3c12306,xiao,UFO' person.txt

101,zeq,CEO

102,zhang,CTO

12306,xiao,UFO

104,yy,CFO

105,faker,CIO

110,ahao,COCO

2.1.1 单行

1.   p 打印模式空间的内容

2.   -n 取消默认的sed软件的输出

创建环境

[root@oldboyedu43 ~]# cd /oldboy/

[root@oldboyedu43 oldboy]# touch person.txt

[root@oldboyedu43 oldboy]# cat >>person.txt<<EOF

> 101,oldboy,CEO

> 102,zhangyao,CTO

> 103,Alex,COO

> 104,yy,CFO

> 105,feixue,CIO

> EOF

1: 取具体的某一行   sed -n '3p' person.txt

[root@oldboyedu43 oldboy]# sed -n '3p' person.txt

103,Alex,COO

2. 显示文件的最后一行  sed -n '$p' person.txt

[root@oldboyedu43 oldboy]# cat person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO                                                                                                      

[root@oldboyedu43 oldboy]# sed -n '$p' person.txt

105,feixue,CIO  

3. 取包含xxx的行

[root@oldboyedu43 oldboy]# sed -n '/oldboy/p' person.txt 

101,oldboy,CEO

6.2.1 增

  • 这里我们需要用到2个sed命令,分别是:
    “a”:追加文本到指定行后,记忆方法:a的全拼是apend,意思是追加。
    “i“:插入文本到指定行前,记忆方法:i的全拼是insert,意思是插入。
6.2.1.1 单行增

[root@chensiqi1 ~]# sed '2a 106,dandan,CSO' person.txt

101,chensiqi,CEO

102,zhangyang,CTO106,dandan,CSO   #这就是新增那句

103,Alex,COO

104,yy,CFO

105,feixue,CIO

命令行详解:

  • 2代表指定对第2行操作,其他的行忽略

  • i代表插入的意思,2i即在第2行前插入文本

  • 2i后面加上空格,然后跟上你想要插入的文本即可

最后接上你想要处理的文件person.txt

2.1.4 在文件最后一行增加

12306,xiao,UFO

12580,tao,XO

[root@zeq lx]# sed  '$a12306,xiao,UFOn12580,tao,XO' person.txt    $最后一行   n回车

101,zeq,CEO

102,zhang,CTO

103,Love,COO

104,yy,CFO

105,faker,CIO

110,ahao,COCO

12306,xiao,UFO

12580,tao,XO

2.1.2 多行

1. 连续的多行-地址范围精讲  连续的行使用 , 号

没有地址,默认匹配所有行

sed -n ‘从哪里来,哪里去p’

  数字 :sed -n '1,3p' person.txt

[root@oldboyedu43 oldboy]# sed -n '1,3p' person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

 2. 正则地址范围-模糊,容易找多了

 正则 :sed -n '/oldboy/p' person.txt

          sed -n '/oldboy/,/yy/p' person.txt

[root@oldboyedu43 oldboy]# sed -n '/oldboy/p' person.txt

101,oldboy,CEO

[root@oldboyedu43 oldboy]# sed -n '/o.*y/p' person.txt 

101,oldboy,CEO

[root@oldboyedu43 oldboy]##显示包含oldboy的行到包含yy的行

[root@oldboyedu43 oldboy]# sed -n '/oldboy/,/yy/p' person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

3. 不连续的多行 使用 ; 号隔开(使用分号)

[root@oldboyedu43 oldboy]# #同一行放多个命令用;

[root@oldboyedu43 oldboy]# sed -n '1p;4p;5p' person.txt 

101,oldboy,CEO

104,yy,CFO

105,feixue,CIO

6.2.1.2 引号的区别总结
  1. 双引号:把双引号的内容输出出来;如果内容中有命令,变量等,会先把命令,变量解析出结果,然后再输出最终内容来。双引号内命令或变量的写法为`命令或变量`或$(命令或变量)

  2. 单引号:所见即所得,将单引号内的内容原样输出,阻止所有字符的转义

  3. 不加引号:不会将含有空格的字符串视为一个整体输出,如果内容中有命令,变量等,会先把命令,变量解析出结果,然后再输出最终内容来,如果字符串含有空格等特殊字符,则不能完整输出,则需改加双引号。

  4. 倒引号(反引号Esc键下方):进行命令的替换,在倒引号内部的shell命令将会被执行,其结果输出代替用倒引号括起来的文本。

     

Sed为何用单引号?

[root@chensiqi1 ~]# cat person.txt

101,chensiqi,CEO

102,zhangyang,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO [root@chensiqi1 ~]# sed '2i $PATH' person.txt  #单引号--文本内容原封不动插入

101,chensiqi,CEO $PATH

102,zhangyang,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@chensiqi1 ~]# sed 2i $PATH person.txt   #不加引号,linux无法辨认空格,不会把有空格的命令当成一条命令来执行sed: -e expression #1, char 2: expected after `a', `c' or `i'

[root@chensiqi1 ~]# sed "2i $PATH" person.txt #双引号--变量$PATH被解析以后在当作文本进行插入

101,chensiqi,CEO /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 102,zhangyang,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO

 

企业案例1:优化SSH配置(一键完成增加若干参数

在我们学习CentOS6系统优化时,有一个优化点:更改ssh服务远程登录的配置。主要的操作是在ssh的配置文件/etc/ssh/sshd_config加入下面5行文本。(下面参数的具体含义见其他课程。)

Port 52113

PermitRootLogin no

PermitEmptyPasswords no

UseDNS no

GSSAPIAuthentication no

 

这道企业面试题可以用我们学过的sed命令多行追加功能就可以搞定。

[root@chensiqi1 ~]# sed -i '13i Port 52113nPermitRootLogin nonPermitEmptyPasswords nonUseDNS nonGSSAPIAuthentication no' /etc/ssh/sshd_config

 

命令说明:题目要求在第13行前插入,那就需要使用命令13i。有同学做个题目时,是这样想的,在13行前,那不就是12行后吗,12a也是可以的。是的,这样也是没错的,这可以算是第二种方法。 最后插入的5行内容使用“n”就可以变成一行了。 上面还有一个没讲过的选项"-i",这个选项能够实际的修改文件内容,大家练习时可以去掉,防止改掉了配置文件。如果使用了-i,可以用备份文件还原。当然,在生产环境修改配置文件那就需要用-i选项了。

 

[root@chensiqi1 ~]# sed -n '13,17p' /etc/ssh/sshd_config

Port 52113

PermitRootLogin no

PermitEmptyPasswords no

UseDNS no

GSSAPIAuthentication no

命令说明:查看增加的文本内容,选项-n与命令p的具体用法见后文的6.2.4查。

 

2.2 sed 删除 d   

2.1.3 过滤多个字符

-r 支持扩展正则表达式

| 扩展正则,同时过滤多个字符

[root@oldboyedu43 oldboy]# sed -nr '/oldboy|yy/p' person.txt 

101,oldboy,CEO

104,yy,CFO sed里面的正则字符左右必须有“/”

6.2.2 删

2.2.1 删除第2行到第5行

[root@zeq lx]# sed '2,5d' person.txt

101,zeq,CEO

110,ahao,COCO

第3章 增加

6.2.2.1指定执行的地址范围

[root@chensiqi1 ~]# sed 'd' person.txt 下面用具体的例子演示一下,测试文件还是person.txt

[root@chensiqi1 ~]#

命令说明:如果在sed命令前面不指定地址范围,那么默认会匹配所有行,然后使用d命令删除功能就会删除这个文件的所有内容

 

[root@chensiqi1 ~]# sed '2d' person.txt

101,chensiqi,CEO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

命令说明:这个单行删除想必大家能理解,指定删除第2行的文本102,zhangyang,CTO

 

[root@chensiqi1 ~]# sed '/zhangyang/d' person.txt

101,chensiqi,CEO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

命令说明: 在sed软件中,使用正则的格式和awk一样,使用2个”/“包含指定的正则表达式,即“/正则表达式/”

 

6.2.2.2 特殊符号~(步长)解析

例子:

  • 1~2 匹配1,3,5,7.....#-->用于只输出奇书行,大伙仔细观察一下每个数字的差值。

  • 2~2 匹配2,4,6,8....#-->用于只输出偶数行

  • 1~3 匹配1,4,7,10.....

  • 2~3 匹配2,5,8,11.....

[root@chensiqi1 ~]# seq 10

1

2

3

4

5

6

7

8

9

10

命令说明:seq命令能够生成从1到10的数字序列。

 

2.2.2 删除从yy开始的行到文件结尾的内容

[root@zeq lx]# sed   '/yy/,$d' person.txt             $文件结尾

101,zeq,CEO

102,zhang,CTO

103,Love,COO

3.1 单行增加

a 追加append,在指定行后添加一行或多行文本

i 插入insert,在指定行前添加一行或多行文本

[root@oldboyedu43 oldboy]# sed '$a 106,wuxingge,UFO' person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

106,wuxingge,UFO

[root@oldboyedu43 oldboy]# sed '2i 106,wuxingge,UFOn107,lee,XO' person.txt

101,oldboy,CEO

106,wuxingge,UFO

107,lee,XO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

6.2.2.3 特殊符号+解析

[root@chensiqi1 ~]# sed '1,+2d' person.txt  

104,yy,CFO

105,feixue,CIO

命令说明:这其实是做个加法运算,‘1,+2d’==>删除第1行到第3(1+2)行的文本。

 

2.2.3 删除包含ahao的行

[root@zeq lx]# sed '/ahao/d' person.txt

101,zeq,CEO

102,zhang,CTO

103,Love,COO

104,yy,CFO

105,faker,CIO

3.2 多行增加

换行符 n

[root@oldboyedu43 oldboy]# sed '$a 106,wuxingge,UFOn107,lee,XO' person.txt 

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

106,wuxingge,UFO

107,lee,XO

注:cat 命令多行追加

  echo只能在追加到文件末尾  echo >>

  vim 可以写入

6.2.2.4 特殊符号!解析

感叹号“!”我们在很多命令里都接触过,大部分都是取反的意思,在sed中也不例外

[root@chensiqi1 ~]# sed '2,3!d' person.txt

102,zhangyang,CTO

103,Alex,COO 命令说明:

在地址范围“2,3”后面加上“!”,如果不加“!”表示删除第2行和第3行,结果如下面的例子所示

然后加上“!”的结果就是除了第2行和第3行以外的内容都删除,这个方法可以作为显示文件的第2,3行题目的补充方法。

[root@chensiqi1 ~]# sed '2,3d' person.txt 101,chensiqi,CEO104,yy,CFO105,feixue,CIO

 

2.2.4 删除不包含ahao的行

[root@zeq lx]# sed '/ahao/!d' person.txt             !取反,排除

110,ahao,COCO

第4章 删除

6.2.3 改

2.3 sed 替换 's###g'

4.1 单行删除

  d删除 delete

  $ 代表文件的最后一行

  '1d'  或 '/oldboy/d'

[root@oldboyedu43 oldboy]# cat person.txt

101,oldboy,CEO

102,zhangyao,CTO  

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@oldboyedu43 oldboy]# sed '/oldboy/d' person.txt 

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

6.2.3.1 按行替换

例子:

[root@chensiqi1 ~]# sed '2c 106,dandan,CSO' person.txt

101,chensiqi,CEO

106,dandan,CSO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

命令说明:使用sed命令c将原来第2行“102,zhangyang,CTO”替换成“106,dandan,CSO”,整行替换

2.3.1 替换掉所有的数字

[root@zeq lx]# sed 's#[0-9]##g'  person.txt

,zeq,CEO

,zhang,CTO

,Love,COO

,yy,CFO

,faker,CIO

,ahao,COCO

4.2 多行删除

[root@oldboyedu43 oldboy]# sed '1,4d' person.txt 

105,feixue,CIO

6.2.3.2 文本替换
  • 这里用到的sed命令,选项:
    “s”:单独使用-->将每一行中第一处匹配的字符串进行替换==>sed命令
    “g”:每一行进行全部替换-->sed命令s的替换标志之一(全局替换),非sed命令。
    “-i”:修改文件内容-->sed软件的选项,注意和sed命令i区别。

sed软件替换模型

sed -i 's/目标内容/替换内容/g' chensiqi.log
sed -i 's#目标内容#替换内容#g'

例子:

[root@chensiqi1 ~]# sed 's#zhangyang#dandan#g' person.txt

101,chensiqi,CEO

102,dandan,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

命令说明:

将需要替换的文本“zhangyang”放在第一个和第二个“#”之间

将替换后的文本“dandan”放在第二个核第三个“#”之间。结果为第二行的“zhangyang”替换为“dandan”

 

2.3.2 替换掉每行中的第一个数字

[root@zeq lx]# sed 's#[0-9]##'  person.txt       sed 's#[0-9]##' 不加g,默认是匹配到每行第一个数字       sed 's#[0-9]##2' 匹配每行第二个数字

01,zeq,CEO

02,zhang,CTO

03,Love,COO

04,yy,CFO

05,faker,CIO

10,ahao,COCO

4.3 企业案例:不显示文件中的空行

1. sed '/^$/d' person.txt

[root@oldboyedu43 oldboy]# sed -r '/^$/d' person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

2. grep -v '^$' person.txt

[root@oldboyedu43 oldboy]# grep -v '^$' person.txt 

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

3. awk '!/^$/' person.txt

[root@oldboyedu43 oldboy]# awk '!/^$/' person.txt 

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

4. sed -n '/^$/!p' person.txt

[root@oldboyedu43 oldboy]# sed -n '/^$/!p' person.txt 

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

6.2.3.3 变量替换

[root@chensiqi1 ~]# cat >test.txt<<KOF #再新建一个简单的测试文本

> a > b > a > KOF [root@chensiqi1 ~]# cat test.txt

a b a [root@chensiqi1 ~]# x=a #->设置变量x并 赋值a

[root@chensiqi1 ~]# y=b #-> 设置变量y并赋值b

[root@chensiqi1 ~]# echo $x

a [root@chensiqi1 ~]# echo $x $y

a b 命令说明:打印变量x,y验证一下,需要使用$符号引用变量

 

2.3.3 后向引用  取出ip地址

[root@zeq ~]# ifconfig eth0 |sed -rn '2s#^.*r:(.*)  Bc.*#1#gp'

10.0.0.200

[root@zeq ~]# ifconfig eth0 |awk -F'[ :]+'   'NR==2{print $4}'

10.0.0.200

[root@zeq ~]# ifconfig eth0 |awk -F'addr:|  Bc'   'NR==2{print $2}'

10.0.0.200

[root@zeq ~]# ifconfig eth0 |awk -F'[^0-9.]+'   'NR==2{print $2}'

10.0.0.200

第5章 替换

6.2.3.4 分组替换()和1的使用说明

sed软件的()的功能可以记住正则表达式的一部分,其中,1为第一个记住的模式即第一个小括号中的匹配内容,2第二个记住的模式,即第二个小括号中的匹配内容,sed最多可以记住9个。

例:echo "I am chensiqi teacher."如果想保留这一行的单词chensiqi,删除剩下部分,使用圆括号标记想保留的部分

[root@chensiqi1 ~]# echo "I am chensiqi teacher." | sed 's#^.*am ([a-z]+) tea.*$#1#g'

chensiqi [root@chensiqi1 ~]# echo "I am chensiqi teacher." | sed -r 's#^.*am ([a-z]+) tea.*$#1#g'

chensiqi [root@chensiqi1 ~]# echo "I am chensiqi teacher." | sed -r 's#I (.*) (.*) teacher.#12#g'

amchensiqi 命令说明: sed如果不加-r后缀,那么默认不支持扩展正则表达式,需要符号进行转义

小括号的作用是将括号里的匹配内容进行分组以便在第2和第3个#号之间进行sed的反向引用,1代表引用第一组,2代表引用第二组

 

企业案例4:系统开机启动项优化(利用sed)

[root@chensiqi1 ~]# chkconfig --list | egrep -v  "sshd|crond|rsyslog|sysstat|network" | awk '{print $1}' |sed -r 's#^(.*)#chkconfig 1 off#g' |bash

 

2.4 sed  查

5.1 文本替换

6.2.4 查

2.4.1 显示文件的第5行

[root@zeq ~]# sed -n 5p person.txt

105,faker,CIO

5.1.1 sed -i 's#a#b#g' oldboy.log

  s   单独使用——>将每一行中第一个匹配的字符串进行替换

[root@oldboyedu43 oldboy]# cat person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@oldboyedu43 oldboy]# sed 's#[0-9]#oldboy#' person.txt 

oldboy01,oldboy,CEO

oldboy02,zhangyao,CTO

oldboy03,Alex,COO

oldboy04,yy,CFO

oldboy05,feixue,CIO

   g   global 每一行进行全部替换——>sed指令s的替换标志之一(全局替换)

[root@oldboyedu43 oldboy]# sed 's#[1-9]#AA#g' person.txt

AA0AA,oldboy,CEO

AA0AA,zhangyao,CTO

AA0AA,Alex,COO

AA0AA,yy,CFO

AA0AA,feixue,CIO

6.2.4.1 按行查询

[root@chensiqi1 ~]# sed '2p' person.txt

101,chensiqi,CEO

102,zhangyang,CTO

102,zhangyang,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

命令说明:选项-n取消默认输出,只输出匹配的文本,大家只需要记住使用命令p必用选项-n。 [root@chensiqi1 ~]# sed -n '2,3p' person.txt

102,zhangyang,CTO

103,Alex,COO 命令说明:查看文件的第2行到3行,使用地址范围“2,3”。取行就用sed,最简单

 

2.4.2 显示文件的第2行到第5行

[root@zeq ~]# sed -n '2,5p' person.txt

102,zhang,CTO

103,Love,COO

104,yy,CFO

105,faker,CIO

5.1.2 修改文件 -i

  sed -i.bak 's#[1-9]#AA#g' person.txt

  -i.bak  先把文件备份为 person.txt.bak ,然后再修改文件的内容

   -i   参数要放在sed所有参数最后面

sed -i.bak.$(date +%F) 's#[1-9]#AA#g' person.txt

[root@oldboyedu43 oldboy]# sed -i.bak.$(date +%F) 's#[1-9]#AA#g' person.txt

[root@oldboyedu43 oldboy]# cat person.txt

AA0AA,oldboy,CEO

AA0AA,zhangyao,CTO

AA0AA,Alex,COO

AA0AA,yy,CFO

AA0AA,feixue,CIO

[root@oldboyedu43 oldboy]# cat person.txt.bak.2018-01-12

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

6.2.4.2 按字符串查询

[root@chensiqi1 ~]# sed -n '/CTO/p' person.txt

102,zhangyang,CTO 命令说明:打印含CTO的行 [root@chensiqi1 ~]# sed -n '/CTO/,/CFO/p' person.xt

102,zhangyang,CTO

103,Alex,COO

104,yy,CFO 命令说明:打印含CTO的行到含CFO的行。

 

 

2.4.3 显示文件最后一行

[root@zeq ~]# sed -n '$p' person.txt

110,ahao,COCO

5.2 变量替换

6.2.4.3 过滤多个字符

[root@chensiqi1 ~]# sed -rn '/chensiqi|yy/p' person.txt

101,chensiqi,CEO

104,yy,CFO 命令说明: 使用扩展正则“|”,为了不使用转义符号“”,因此使用-r选项开启扩展正则表达式模式

 

2.4.4 显示文件中包含zeq的行

[root@zeq ~]# sed -n '/zeq/p' person.txt

101,zeq,CEO

5.2.1 变量替换

[root@oldboyedu43 oldboy]# a=oldboy    定义变量

[root@oldboyedu43 oldboy]# b=old       定义变量

[root@oldboyedu43 oldboy]# cat person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@oldboyedu43 oldboy]# sed "s#$a#$b#g" person.txt   sed使用变量

101,old,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

7,sed命令应用知识扩展

2.4.5 显示文件中从包含101的行到105的行

[root@zeq ~]# sed -n '/101/,/105/p' person.txt

101,zeq,CEO

102,zhang,CTO

103,Love,COO

104,yy,CFO

105,faker,CIO

5.2.2 引号的区别总结

1.单引号-所见即所得

[root@oldboyedu43 oldboy]# echo 'stu{1..6},`pwd`'

stu{1..6},`pwd`

2.双引号-对特殊符号进行解析 $ $() ``

[root@oldboyedu43 oldboy]# echo "stu{1..6},`pwd`"

stu{1..6},/oldboy

[root@oldboyedu43 oldboy]# echo "I'm aaa"

I'm aaa                                         

[root@oldboyedu43 oldboy]# echo 'I'm aaa'

> ^C 想要显示单引号是需用双引号

3.不加引号和双引号一样,支持通配符{}*.txt

[root@oldboyedu43 oldboy]# echo stu{1..6},`pwd`

stu1,/oldboy stu2,/oldboy stu3,/oldboy stu4,/oldboy stu5,/oldboy stu6,/oldboy

4.反引号

[root@oldboyedu43 oldboy]# echo `pwd` ddd

/oldboy ddd

5.3 反向引用

()的功能可以禁止正则表达式的一部分

扩展正则,使用-r

1引用第一个小括号中的匹配内容, 2引用第二个小括号中的匹配内容,sed最多可以记住9个

7.1 sed如何取不连续的行

[root@chensiqi1 ~]# sed -n '1p;3p;5p' person.txt

101,chensiqi,CEO

103,Alex,COO

105,feixue,CIO

2.4.6 特殊写法:显示文件的第1和4行和5行

[root@zeq ~]# sed -n '1p ;4p; 5p' person.txt

101,zeq,CEO

104,yy,CFO

105,faker,CIO

5.3.1 预备知识——sed &

sed &前面正则匹配到的内容

[root@oldboyedu43 oldboy]# echo 123456|sed -r 's#([0-9])#<1>#g'

<1><2><3><4><5><6>

[root@oldboyedu43 oldboy]# echo 123456|sed  's#[0-9]#<&>#g'

<1><2><3><4><5><6>

[root@oldboyedu43 oldboy]# echo this is a test line | sed 's#.#<&>#g'

<t><h><i><s>< ><i><s>< ><a>< ><t><e><s><t>< ><l><i><n><e>

正则表达式 w+ 匹配每一个单词,使用 <&>替换它,& 对应于之前所匹配到的单词

[root@oldboyedu43 oldboy]# echo this is a test line | sed 's#w+#<&>#g'

<this> <is> <a> <test> <line>

案例:echo "I am oldboy teacher." 如果想保留这一行的单词oldboy

[root@oldboyedu43 oldboy]# echo "I am oldboy teacher." |sed -r 's#.*(ol.*y).*#1#g'

oldboy

5.3.2 命令拼接——解决不会使用循环

将/oldboy/下所有.jpg的文件名修改为.avi

1. 先在屏幕上拼接出目标命令

[root@oldboyedu43 oldboy]# ls oldboy*.jpg |sed -r 's#(.*)jpg#mv & 1avi#g'

mv oldboy01.jpg oldboy01.avi

mv oldboy02.jpg oldboy02.avi

mv oldboy03.jpg oldboy03.avi

mv oldboy04.jpg oldboy04.avi

mv oldboy05.jpg oldboy05.avi

mv oldboy06.jpg oldboy06.avi

mv oldboy07.jpg oldboy07.avi

mv oldboy08.jpg oldboy08.avi

mv oldboy09.jpg oldboy09.avi

mv oldboy10.jpg oldboy10.avi

2. 最终交给 |bash执行

[root@oldboyedu43 oldboy]# ls oldboy*.jpg |sed -r 's#(.*)jpg#mv & 1avi#g' |bash

[root@oldboyedu43 oldboy]# ls oldboy*

oldboy01.avi  oldboy03.avi  oldboy05.avi  oldboy07.avi  oldboy09.avi  oldboy.txt

oldboy02.avi  oldboy04.avi  oldboy06.avi  oldboy08.avi  oldboy10.avi

5.4 拓展

7.2 特殊符号{}的使用

[root@chensiqi1 ~]# sed -n '2,4p;=' person.txt

1

102,NB,CTO

2

103,Alex,COO

3

104,yy,CFO

4

5

命令说明:-n去掉默认输出,2,4p,输出2到4行内容,=输出全部的行的行号 [root@chensiqi1 ~]# sed -n '2,4{p;=}' person.txt

102,NB,CTO

2

103,Alex,COO

3

104,yy,CFO

4

命令说明:‘2,4{p;=}’代表统一输出2,4行的行号和内容

2.4.7 显示有规律的行

[root@zeq ~]# seq 10 |sed -n '1~2p'

1

3

5

7

9

5.4.1 rename替换(重命名)

rename     from         to         file...

        你要替换的内容   替换成什么   替换哪些文件

rename      jpg         avi        *.jpg

[root@oldboyedu43 oldboy]# rename jpg avi *.jpg

[root@oldboyedu43 oldboy]# ls

oldboy01.avi  oldboy03.avi  oldboy05.avi  oldboy07.avi  oldboy09.avi    

oldboy02.avi  oldboy04.avi  oldboy06.avi  oldboy08.avi  oldboy10.avi  

 5.4.2 sed里面表示非

2.5 sed命令中使用变量

root@zeq ~]# x=zeq               设置x变量为zeq

[root@zeq ~]# y=zeq1             设置y变量为zeq1

[root@zeq ~]# sed 's#$x#$y#g'  person.txt

101,zeq1,CEO

102,zhang,CTO

103,Love,COO

104,yy,CFO

105,faker,CIO

110,ahao,COCO

12306,xiao.UFO

5.4.3 特殊符号=获取行号

2.5.1 把文件person.txt文件中的每一行的内容 替换为对应的行号

for n in {1..7}                     这里使用的shell脚本中的for循环

do

     sed -i.bak "${n}s#.*#$n#g" person.txt

done

5.4.4 一条sed语句执行多条命令

2.5.2 批量重命名:删除文件名中的html_

touch zeq_html_{01..10}.jpg

方法1  命令行格式

[root@zeq data]# ls *.jpg|sed -r "s#(.*)(_.*)#mv & zeq2#g"|bash

方法2  for循环

for i in {01..10}

do

mv zeq_${i}.jpg  zeq_html_${i}.jpg 

done

方法3  rename

rename  html_  ""    *.jpg        rename   修改谁    改为什么    修改什么文件

 

第6章 使用sed命令常见的坑

6.1 -r 与-i同时使用

  -r 参数在前面

-ri  正常

[root@oldboyedu43 oldboy]# cat ett.txt

oldboy

olldboooy

test

[root@oldboyedu43 oldboy]# sed -ri 's#[o]+{2}#AAAA#g' ett.txt

[root@oldboyedu43 oldboy]# cat ett.txt

oldboy

olldbAAAAy

test

-ir  先把文件备份为xxr,然后再替换文件中的内容

[root@oldboyedu43 oldboy]# cat ett.txt

oldboy

olldboy                                                           源文件内容

test

[root@oldboyedu43 oldboy]# sed -ir 's#[l]+{2}#o#g' ett.txt       sed -ir先备份 

[root@oldboyedu43 oldboy]# ll ett.*

-rw-r--r-- 1 root root 20 Jan 12 19:58 ett.txt

-rw-r--r-- 1 root root 20 Jan 12 19:56 ett.txtr                 备份为ett.txtr

[root@oldboyedu43 oldboy]# cat ett.txt                        因为在上面的命令里r已经不是参数,所以sed 默认不支持扩展正则,文件没有被修改,只是备份

oldboy                                                           

olldboy

test

[root@oldboyedu43 oldboy]# cat ett.txtr

oldboy

olldboy

test

[root@oldboyedu43 oldboy]# sed -rir 's#[l]+{2}#o#g' ett.txt  重新给sed 加上 -r 参数,使 sed支持扩展正则

[root@oldboyedu43 oldboy]# ll ett.*                                    

-rw-r--r-- 1 root root 19 Jan 12 19:58 ett.txt

-rw-r--r-- 1 root root 20 Jan 12 19:58 ett.txtr                             新备份的文件覆盖了刚才的文件

[root@oldboyedu43 oldboy]# cat ett.txt                                     源文件被替换

oldboy

oodboy

test

[root@oldboyedu43 oldboy]# cat ett.txtr                                 备份文件内容不变

oldboy

olldboy

test

6.2 -i禁止与-n一起使用(回顾sed的执行过程)

 -i与-n一起使用会把源文件的内容清空

[root@oldboyedu43 oldboy]# cat ett.txtr

oldboy

olldboy

test

[root@oldboyedu43 oldboy]# sed -ni 's#oldboy#123456#g' ett.txtr

[root@oldboyedu43 oldboy]# cat ett.txtr |wc -l

0

本文由澳门威斯尼人平台登录发布于 操作系统,转载请注明出处:不看绝对后悔的Linux三剑客之sed实战精讲

相关阅读