参数:

-a:追加文本到指定行后

-i:插入文本到指定行前

1、单行增加

[root@redhat~]#   sed  ' 2a  6,f '  linux.tet

1,a

2,b

6,f

3,c

4,d

5,e

[root@redhat~]#   sed  ' 2i  6,f '  linux.tet

1,a

6,f

2,b

3,c

4,d

5,e

2、多行增加

[root@redhat~]#   sed  ' 2a  6,f\n7,g '  linux.tet

1,a

2,b

6,f        #-->第一种写法

7,g

3,c

4,d

5,e

[root@redhat~]#   sed  ' 2a  6,f  \

>  7,g '  linux.tet

1,a

2,b

6,f        #第二种写法

7,g

3,c

4,d

5,e

#-->sed命令i的使用方法是一样的,因此不再列出。

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

系统优化时,有一个优化点:更改ssh服务远程登录的配置。主要的操作是在ssh的配置文件加入下面5行文本。

1.Port  52113

2.PermitRootlogin  no

3.PermitEmptyPasswords  no

4.UseDNS  no

5.GssAPIAuthentication  no

我们可以使用vi命令编辑这个文本,但这样就比较麻烦,现在想一条命令增加5行文本到第13行前?

指定执行的地址范围

1.sed软件可以对单行或多行进行处理。如果在sed命令前面不指定地址范围,那么默认会匹配所有行

2.用法,n1[,n2]{sed-commands}

3.地址用逗号分隔的,n1,n2可以用数字、正则表达式、或二者的组合表示

4.例子:

1)10{sed-commands}        对第10行操作

2)10,20{sed-commands}        对第10到20行操作,包括第10,20行

3)10,+20{sed-commands}        对第10到30(10+20)行操作,包括第10,30行

4)1~2{sed-commands}        对第1,3,5,7......行操作

5)10,  ${sed-commands}        对第10到最后一行($代表最后一行)操作,包括第10行

6)/redhat/{sed-commands}        对匹配redhat的行操作

7)/redhat/,/linux/{sed-commands}        对匹配redhat的行到匹配linux的行操作

8)/redhat/,${sed-commands}        对匹配redhat的行到最后一行操作

9)/redhat/,10{sed-commands}        对匹配redhat的行到第10行操作,注意,如果前10行没有匹配到redhat,sed软件会显示10行以后的匹配redhat的行,如果有

10)1,/redhat/{sed-commands}        对第1行到匹配redhat行的操作

11)/redhat/ ,+2{sed-commands}        对匹配redhat的行到其后的2行操作

3、删

d:删除指定的行

[root@redhat~]#   sed  ' d '  linux.tet     #-->删除所有

[root@redhat~]#   sed  ' 2d '  linux.tet

1,a

3,c

4,d

5,e

[root@redhat~]#   sed  ' 2,5d '  linux.tet

1,a

[root@redhat~]#   sed  ' 1~2d '  linux.tet

2,b

4,d

[root@redhat~]#   sed  ' 1,+2d '  linux.tet

4,d

5,e

[root@redhat~]#   sed  ' /redhat/d '  linux.tet     #-->删除包含“wuyang”的行

1,wuyang,a

4、改

1)按行替换

c:用新行取代旧行

[root@redhat~]#   sed  ' 2c  6,f '  linux.tet

1,a

6,f

3,c

4,d

5,e

2)文本替换

s:单独使用-->将每一行中第一处匹配的字符串进行替换==>sed命令

g:每一行进行全部替换==>sed命令s的替换标志之一,非sed命令

-i:修改文件内容==>sed软件的选项

sed软件替换模型(a被替换成b)

sed  -i  ' s/a/b/g '  redhat.log

sed  -i  ' s#a#b#g '  redhat.log

观察特点

1.两边是引号,引号里面的两边分别为s和g,中间是三个一样的字符/或#作为定界符。#能在替换内容包含/有助于区别。定界符可以是任意符号如 : 或 | 等,但当替换内容包含定界符时,需要转义即:|。经过长期实践,建议大家使用#作为定界符。

2.定界符/或#,第一个和第二个之间的就是被替换的内容,第二个和第三个之间的就是替换后的内容。

3.s#a#b#g,a能用正则表达式,但b不能用,必须是具体的。

4.默认sed软件是对模式空间(内存中的数据)操作,而-i选项会更改磁盘上的文件内容。

企业案例:指定行修改配置文件

指定行精确修改配置文件,这样可以防止修改所多了地方。

[root@redhat~]#   sed  ' 3s#3#9# '  linux.tet

1,a

2,b

9,c

4,d

5,e

3)变量替换

[root@redhat~]#   cat  test.txt  #-->创建一个文本

a

b

a

[root@redhat~]#  x=a

[root@redhat~]#  y=b

[root@redhat~]#  echo  $x  $y

a  b

[root@redhat~]#  sed  s#$x#$y#g  test.txt

b

b

b

[root@redhat~]#  sed  's#$x#$y#g'  test.txt

a

b

a

[root@redhat~]#  sed  "s#$x#$y#g"  test.txt

b

b

b

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

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

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

[root@redhat~]#  echo  I  am  student. | sed  ' s#^.*am  \([a-z].*\)  stu.*$#\1#g '

student

[root@redhat~]#  echo  I  am  student. | sed  -r  ' s#^.*am  ([a-z].*)  stu.*$#\1#g '

student

1. ^.*am-->这句的意思是以任意字符开头到am 为止,匹配文件中的I  am 字符串

2. \([a-z].*\)-->这句的外壳就是括号\( \),里面的[a-z]表示匹配26个字母的任何一个,[a-z].*合起来就是匹配任意多个字符,本题来说就是匹配student字符串,由于student字符串是需要保留的,因此用括号括起来匹配,后面通过\1来取student字符串

3. stu.*$-->表示以空格tea起始,任意字符结尾,实际就是匹配student字符串后,紧接着的字符串student

4.后面被替换的内容中的\1就是取前面的括号里的内容了,也就是我们要的student字符串

5、()是扩展正则表达式的元字符,sed软件默认识别基本正则表达式,想要使用扩展正则需要使用\转义,即\( \)。sed使用-r选项则可以识别扩展正则表达式,此时使用\( \)反而会出错

企业案例:系统开机启动项优化

[root@redhat~]#  chkconfig  --list | grep  "3:on" | grep  -vE  "sshd | crond | network | rsyslog | sysstat" | awk  ' {print  $1} ' | sed  -r  ' s#^(.*)#chkconfig  \1  off#g ' | bash

[root@redhat~]#  chkconfig  --list | grep  "3:on"

5)特殊符号&代表被替换的内容

[root@redhat~]#  sed  '1,3s#c#--&--#g'  redhat.txt     #-->此处&等于c

1,a,--c--eo

2,b,--c--to

3,c,--c--oo

4,d,cfo

5,e,cio

企业案例:批量重命名文件

当前目录下有文件如下所示:

[root@redhat~]#  ls

stu_10_1_a.jpg   stu_10_2_a.jpg   stu_10_3_a.jpg   stu_10_4_a.jpg   stu_10_5_a.jpg

要求用sed命令重命名,效果为stu_10_1_a.jpg==>stu_10_1.jpg,即删除文件名的_a

[root@redhat~]#  ls  *.jpg | sed  -r  's#(^.*)_a.*#mv & \1.jpg#g' | bash

5、查

p:输出指定内容,但默认会输出2次匹配的结果,因此使用n取消默认输出

1)按行查询

[root@redhat~]#   sed  ' 2p '  linux.txt

1,a

2,b

2,b

3,c

4,d

5,e

[root@redhat~]#   sed  -n  ' 2p '  linux.txt

2,b

[root@redhat~]#   sed  -n  ' 2,3p '  linux.txt

2,b

3,c

说明:取行就用sed,最简单

[root@redhat~]#   sed  -n  ' 1~2p '  linux.txt

1,a

3,c

5,e

[root@redhat~]#   sed  -n  ' p '  linux.txt

1,a

2,b

3,c

4,d

5,e

2)按字符串查询

[root@redhat~]#   sed  -n  ' /cto/p '  linux.txt

2,b,cto

[root@redhat~]#   sed  -n  ' /cto/,/cfo/p '  linux.txt

2,b,cto

3,c,coo

4,d,cfo

3)混合查询

[root@redhat~]#   sed  -n  ' 2,/cfo/p '  linux.txt

2,b,cto

3,c,coo

4,d,cfo

[root@redhat~]#   sed  -n  ' /e/,2p '  linux.txt

5,e,cio

#-->特殊情况,前两行没有匹配到e,就向后匹配,如果匹配到e就打印此行

linux三剑客之sed深度实践的更多相关文章

  1. Linux三剑客之sed深度实践讲解(下)

    2.3.4分组替换 \(  \) 和\1的使用说明 echo I am dongdaxia yingxiong. |sed 's#^.*am \([a-z].*\) yin.*$#\1#g' echo ...

  2. Linux三剑客之sed深度实践讲解(上)

    sed sed 是Stream Editor(流编辑器)缩写,是操 作过滤和转换文本内容的强大工具.常用功能有增删改查,过滤,取行. 2.增删改查 2.1 增 a 追加文本到指定行后 i 插入文本到指 ...

  3. linux三剑客grep|sed|awk实践

    最好先学习正则表达式的基本用法,以及正则表达式BREs,EREs,PREs的区别 此坑待填 grep sed awk

  4. Linux实战教学笔记12:linux三剑客之sed命令精讲

    第十二节 linux三剑客之sed命令精讲 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,前言 我们都知道,在Linux中一切皆文件,比如配置文件,日志文件,启动文件 ...

  5. (转)不看绝对后悔的Linux三剑客之sed实战精讲

    不看绝对后悔的Linux三剑客之sed实战精讲 原文:http://blog.51cto.com/hujiangtao/1923718 二.Linux三剑客之sed命令精讲 1,前言 我们都知道,在L ...

  6. day14 linux三剑客之sed命令

    day14 linux三剑客之sed命令 sed命令 Sed 主要用来自动编辑一个或多个文件.简化对文件的反复操作.编写转换程序等. sed(流式编辑器) : sed主要用来修改文件. 1.sed命令 ...

  7. Linux 三剑客之sed

    目录 Linux 三剑客之sed 命令补充: sort命令 uniq命令 cut命令 tr命令 wc命令 三剑客 - sed 编辑模式: 定位分类: 实例如下: d模式--删除模式 p模式--打印 a ...

  8. Linux 三剑客 -- awk sed grep

    本文由本人收集整理自互联网供自己与网友参考,参考文章均已列出,如有侵权,请告知! 顶配awk,中配sed,标配grep awk 参考 sed 参考 grep 参考 在线查看linux命令速记表 app ...

  9. Linux三剑客grep/sed/awk

    grep/sed/awk被称为linux的“三剑客” grep更适合单纯的查找或匹配文本: sed更适合编辑匹配到的文本: awk更适合格式化文本,对文本进行较复杂各式处理: Grep --color ...

随机推荐

  1. GUI的最终选择 Tkinter(四):Entry、Listbox、Scrollbar和Scale组件

    Entry组件 Entry组件就是平时所说的输入框.输入框是程序员用到的最多的一个程序,例如在输入账号和密码的时候需要提供两个输入框,用于接收密码的输入框还会有星号将实际输入的内容隐藏起来. Tkin ...

  2. DB2的常用数据类型

    今天在db2中查询数据时出现错误: Overflow occurred during numeric data type conversion:SQLCODE=-413, SQLSTATE=22003 ...

  3. JS——数组、==和===的区别

    创建数组的方式: 1) <script type='text/javascript'> var aRr = new Array(1,2,3,4,'abc',3) </script&g ...

  4. 嵌入式CISC模型机设计

    一.     课程设计的题目和内容 题目:设计一台嵌入式CISC模型计算机 采用定长CPU周期.联合控制方式,并运行能完成一定功能的机器语言源程序进行验证,机器语言源程序功能如下: 任意输入5个整数, ...

  5. Unity C# 运用 GetSaveFileName() 导出Excel文件

    本文原创,转载请注明出处:http://www.cnblogs.com/AdvancePikachu/p/6944870.html 唉哟,这次厉害咯,网上搜罗了好久,终于被我找到汉化的保存对话框了,根 ...

  6. HQL语句中的join fetch

    from Paper as paper join fetch paper.authors as authors where authors.id='xxxx'; from Paper as paper ...

  7. js 数组操作常用方法

    push():在数组后面加入元素,并返回数组的长度: unshift():在数组前面就如元素,并返回数组的长度: pop():删除最后一个元素: var arr =[1,2,3,4,5] ; arr. ...

  8. Maven建立spring-web项目

    参考博客网址: https://blog.csdn.net/caoxuekun/article/details/77336444 1.eclipse集成maven 2.maven创建web项目 3.搭 ...

  9. Sqlserver列出所有数据库名,表名,字段名【转】

    1.获取所有数据库名: SELECT Name FROM Master..SysDatabases ORDER BY Name 注意: 表Master与SysDatabases之间有两个点 2.获取所 ...

  10. POJ 3281 Dining(网络流最大匹配)

    分析: 数学模型是三个集合A,B,C,(a,b,c)构成一个匹配.因为图一个点只能匹配一次,把a拆点a',a", 在可以匹配的点上连边,s - b - a' - a" - c - ...