sed命令详解

sed命令详解

1 命令功能

    sed是一个相当强大的文件处理编辑工具,sed用来替换,删除,更新文件中的内容。sed以文本行为单位进行处理,一次处理一行内容。首先sed吧当前处理的行存储在临时的缓冲区中(称为模式空间pattern space),接着处理缓冲区中的行,处理完成后,吧缓冲区的内容输出到屏幕。sed处理完一行就将其从临时缓冲区删除,然后将下一个行读入,进行处理和显示,这样不断重复直至处理完最后一行内容,sed便结束运行

2 命令语法

    sed 【选项与参数-nefri】 '【命令】' 【文件名】

3 选项与参数

    -n   使用安静(silent)模式,无-n选项则所有来自标准输入的数据和sed查询到的结果一般都会被列出到终端上,而加上-n后,则只将经过sed处理的结果列出。

    -e   进行多项编辑,即对输入行应用多条sed命令时使用,直接在命令模式上进行sed的动作编辑

    -f   指定sed命令执行的脚本名,直接将sed【命令】写入到文件中,通过-f参数来指定执行。

    -r   指定扩展正则表达式,(不使用-r选项。默认为基本正则表达式)

    -i   直接修改文件,不在终端中输出结果

4 命令参数

    n1,n2   表示行号,该参数可选,表示操作的行数,可以是数字,正则表达式或者二者结合。用逗号分隔表示n1-n2行的范围

    a   新增,表示在当前行的下一行追加一行文本内容。a 的后面可以接字串,而这些字串会在下一行出现

    i    插入,表示在当前行的上一行插入一行文本内容。i 的后面可以接字串,而这些字串会在上一行出现

    c   替换,以行为单位进行替换,c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行

    d   删除,因为是删除,所以d后面通常不接任何内容

    p   打印,打印行的内容,通常p会与参数-n一起使用

    s   替换,替换行中的内容,通常s命令搭配正则表达式使用,如1,20s/linux/linux1/g,如果不跟g,则在行中替换第一个匹配的模式后终止,不在向行后查找,g表示整行查找

    =  打印行号

5 使用范例

【1】打印文件中第n行的内容

【2】删除包含字符到包含字符的行之间的行

【3】删除包含字符到第n行的内容

【4】使用模式进行查询

【5】追加一行或多行字符串

注:使用\n来进行换行,使得在一行后追加多条内容

【6】代替一行或多行

【7】代替一行或多行

【8】替换行中的内容










sed:Stream Editor文本流编辑,sed是一个“非交互式的”面向字符流的编辑器。能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上。还可以对原文件改动,但是不会再屏幕上返回结果。

sed命令的语法格式:

sed的命令格式: sed [option] 'sed command'filename

sed的脚本格式:sed [option] -f 'sed script'filename

sed命令的选项(option):

-n :只打印模式匹配的行

-e :直接在命令行模式上进行sed动作编辑,此为默认选项

-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作

-r :支持扩展表达式

-i :直接修改文件内容

sed在文件中查询文本的方式:

1)使用行号,可以是一个简单数字,或是一个行号范围

x

x为行号

x,y

表示行号从x到y

/pattern

查询包含模式的行

/pattern /pattern

查询包含两个模式的行

pattern/,x

在给定行号上查询包含模式的行

x,/pattern/

通过行号和模式查询匹配的行

x,y!

查询不包含指定行号x和y的行

\

\

\

2)使用正则表达式、扩展正则表达式(必须结合-r选项)

^

锚点行首的符合条件的内容,用法格式"^pattern"

$

锚点行首的符合条件的内容,用法格式"pattern$"

^$

空白行

.

匹配任意单个字符

*

匹配紧挨在前面的字符任意次(0,1,多次)

.*

匹配任意长度的任意字符

\?

匹配紧挨在前面的字符0次或1次

\{m,n\}

匹配其前面的字符至少m次,至多n次

\{m,\}

匹配其前面的字符至少m次

\{m\}

精确匹配前面的m次\{0,n\}:0到n次

\<

锚点词首----相当于 \b,用法格式:\<pattern

\>

锚点词尾,用法格式:\>pattern

\<pattern\>

单词锚点

 

分组,用法格式:pattern,引用\1,\2

[]

匹配指定范围内的任意单个字符

[^]

匹配指定范围外的任意单个字符

[:digit:]

所有数字, 相当于0-9, [0-9]---> [[:digit:]]

[:lower:]

所有的小写字母

[:upper:]

所有的大写字母

[:alpha:]

所有的字母

[:alnum:]

相当于0-9a-zA-Z

[:space:]

空白字符

[:punct:]

所有标点符号

[java]  view plain  copy
 
  1. #######sed的匹配模式支持正则表达式#####################  
  2. sed'5 q'/etc/passwd#打印前5行  
  3. sed-n '/r*t/p'/etc/passwd#打印匹配r有0个或者多个,后接一个t字符的行  
  4. sed-n '/.r.*/p'/etc/passwd#打印匹配有r的行并且r后面跟任意字符  
  5. sed-n '/o*/p'/etc/passwd#打印o字符重复任意次  
  6. sed-n '/o\{1,\}/p'/etc/passwd#打印o字重复出现一次以上  
  7. sed-n '/o\{1,3\}/p'/etc/passwd#打印o字重复出现一次到三次之间以上  

sed的编辑命令(sed command):

p

打印匹配行(和-n选项一起合用)

=

显示文件行号

a\

在定位行号后附加新文本信息

i\

在定位行号后插入新文本信息

d

删除定位行

c\

用新文本替换定位文本

w filename

写文本到一个文件,类似输出重定向 >

r filename

从另一个文件中读文本,类似输入重定向 <

s

使用替换模式替换相应模式

q

第一个模式匹配完成后退出或立即退出

l

显示与八进制ACSII代码等价的控制符

{}

在定位行执行的命令组,用分号隔开

n

从另一个文件中读文本下一行,并从下一条命令而不是第一条命令开始对其的处理

N

在数据流中添加下一行以创建用于处理的多行组

g

将模式2粘贴到/pattern n/

y

传送字符,替换单个字符

对文件的操作无非就是”增删改查“,怎样用sed命令实现对文件的”增删改查“,玩转sed是写自动化脚本必须的基础之一。

sed命令打印文件信息(查询):

[java]  view plain  copy
 
  1. ####用sed打印文件的信息的例子的命令######  
  2. sed -n '/^#/!p'  /etc/vsftpd/vsftpd.conf         
  3. sed -n '/^#/!{/^$/!p}'  /etc/vsftpd/vsftpd.conf  
  4. sed -e '/^#/d' -e '/^$/d'  /etc/vsftpd/vsftpd.conf  
  5. sed -n '1,/adm/p' /etc/passwd  
  6. sed -n '/adm/,6p' /etc/passwd  
  7. sed -n '/adm/,4p' /etc/passwd  
  8. sed -n '/adm/,2p' /etc/passwd  
  9. ###以下图片是对这些sed命令例子的解释和显示结果  

\

\

\

\

sed命令实现对文件内容的添加:(对源文件添加的话就用-i参数):

[java]  view plain  copy
 
  1. ####sed命令可以实现的添加######  
  2. #1)匹配行的行首添加,添加在同行  
  3. #2)匹配行的行中的某个字符后添加  
  4. #3)匹配行的行尾添加字符  
  5. #4)匹配行的行前面行添加  
  6. #5)匹配行的行后面行添加  
  7. #6)文件的行首添加一行  
  8.   [root@jie1 ~]# sed -i '1 i\sed command start' myfile  
  9. #7)文件的行尾追加一行  
  10.   [root@jie1 ~]# sed -i '$a \sed command end' myfile  

\

 

\

 

\

\

\

\

\

\

\

sed命令实现对文件内容的删除:(对源文件直接删除用-i参数):

sed的删除操作是针对文件的行,如果想删除行中的某个字符,那就用替换(别急,替换稍后就讲,而且替换是sed最常用的)

\

\

\

\

 重点:sed命令实现对文件内容的替换(替换是在shell自动化脚本中用到最多的操作)

[java]  view plain  copy
 
  1. #================源文件里面的内容===============================  
  2. [root@jie1 ~]# cat test  
  3. anonymous_enable=YES  
  4. write_enable=YES  
  5. local_umask=022  
  6. xferlog_enable=YES  
  7. connect_from_port_20=YES  
  8. root:x:0:0:root:/root:/bin/bash  
  9. bin:x:1:1:bin:/bin:/sbin/nologin  
  10. daemon:x:2:2:daemon:/sbin:/sbin/nologin  
  11. adm:x:3:4:adm:/var/adm:/sbin/nologin  
  12. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin  
  13. DEVICE="eth0"  
  14. BOOTPROTO="static"  
  15. HWADDR="00:0C:29:90:79:78"  
  16. ONBOOT="yes"  
  17. IPADDR=172.16.22.1  
  18. NETMASK=255.255.0.0  
  19. #======================================================================  
  20. [root@jie1 ~]# sed -i '/DEVICE/c\Ethernet' test   
  21.         #匹配DEVICE的行,替换成Ethernet这行  
  22. [root@jie1 ~]# sed -i 's/static/dhcp/' test       
  23.         #把static替换成dhcp(/,@,#都是前面所说的地址定界符)  
  24. [root@jie1 ~]# sed -i '/IPADDR/s@22\.1@10.12@' test  
  25.         #匹配IPADDR的行,把22.1替换成10.12由于.号有特殊意义所有需要转义  
  26. [root@jie1 ~]# sed -i '/connect/s#YES#NO#' test   
  27.         #匹配connect的行,把YES替换成NO  
  28. [root@jie1 ~]# sed -i 's/bin/tom/2g' test         
  29.         #把所有匹配到bin的行中第二次及第二次之后出现bin替换成tom  
  30. [root@jie1 ~]# sed -i 's/daemon/jerry/2p' test    
  31.         #把所有匹配到bin的行中第二次出现的daemon替换成jerry,并在生产与匹配行同样的行  
  32. [root@jie1 ~]# sed -i 's/adm/boss/2' test         
  33.         #把所有匹配到adm的行中仅仅只是第二次出现的adm替换成boss  
  34. [root@jie1 ~]# sed -i '/root/{s/bash/nologin/;s/0/1/g}' test  
  35.         #匹配root的行,把bash替换成nologin,且把0替换成1  
  36. [root@jie1 ~]# sed -i 's/root/(&)/g' test                   
  37.         #把root用括号括起来,&表示引用前面匹配的字符  
  38. [root@jie1 ~]# sed -i 's/BOOTPROTO/#BOOTPROTO/' test        
  39.         #匹配BOOTPROTO替换成#BOOTPROTO,在配置文件中一般用于注释某行  
  40. [root@jie1 ~]# sed -i 's/ONBOOT/#&/' test                   
  41.         #匹配ONBOOT的行的前面添加#号,在配置文件中也表示注释某行  
  42. [root@jie1 ~]# sed -i '/ONBOOT/s/#//' test                  
  43.         #匹配ONBOOT的行,把#替换成空,即去掉#号,也一般用作去掉#注释  
  44. #================执行以上sed命令之后文件显示的内容====================  
  45. [root@jie1 ~]# cat test  
  46. anonymous_enable=YES  
  47. write_enable=YES  
  48. local_umask=022  
  49. xferlog_enable=YES  
  50. connect_from_port_20=NO  
  51. (root):x:1:1:(root):/(root):/bin/nologin  
  52. bin:x:1:1:tom:/tom:/stom/nologin  
  53. daemon:x:2:2:jerry:/sbin:/stom/nologin  
  54. daemon:x:2:2:jerry:/sbin:/stom/nologin  
  55. adm:x:3:4:boss:/var/adm:/sbin/nologin  
  56. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin  
  57. Ethernet  
  58. #BOOTPROTO="dhcp"  
  59. HWADDR="00:0C:29:90:79:78"  
  60. ONBOOT="yes"  
  61. IPADDR=172.16.10.12  
  62. NETMASK=255.255.0.0  

sed引用变量:(在自动化shell脚本 中也经常会使用到变量)

第一种当sed命令里面没有默认的变量时可以把单引号改成双引号;

第二种当sed命令里面有默认的变量时,那自己定义的变量需要加单引号,且sed里面的语句必须用单引

[java]  view plain  copy
 
  1. [root@jie1 ~]# cat >> myfile << EOF  
  2. > hello world  
  3. > i am jie  
  4. > how are you  
  5. > EOF   #先生成一个文件  
  6. [root@jie1 ~]# cat myfile  
  7. hello world  
  8. i am jie  
  9. how are you  
  10. [root@jie1 ~]# name=li  
  11.          #定义一个变量,且给变量赋值  
  12. [root@jie1 ~]# sed -i "s/jie/$name/" myfile  
  13.          #把匹配jie的字符替换成变量的值  
  14. [root@jie1 ~]# cat myfile  
  15. hello world  
  16. i am li  
  17. how are you  
  18. [root@jie1 ~]# sed -i "$a $name" myfile  
  19.           #当sed命令也有默认变量时,在去引用自己定义的变量会出现语法错误  
  20. sed: -e expression #1, char 3: extra characters after command  
  21. [root@jie1 ~]# sed -i '$a '$name'' myfile  
  22.           #在引用自定义的变量时,sed语句必须用单引引住,然后把自定义的变量也用单引号引住  
  23. [root@jie1 ~]# cat myfile  
  24. hello world  
  25. i am li  
  26. how are you  
  27. li  
  28. [root@jie1 ~]#  

sed的其它高级使用:

1)把正在用sed操作的文件的内容写到例外一个文件中

[java]  view plain  copy
 
  1. [root@jie1 ~]# cat test   #sed操作的文件中的内容  
  2. Ethernet  
  3. #BOOTPROTO="dhcp"  
  4. HWADDR="00:0C:29:90:79:78"  
  5. ONBOOT="yes"  
  6. IPADDR=172.16.10.12  
  7. NETMASK=255.255.0.0  
  8. [root@jie1 ~]# sed -i 's/IPADDR/ip/w ip.txt' test  
  9.        #把sed操作的文件内容保存到另外一个文件中,w表示保存,ip.txt文件名  
  10. [root@jie1 ~]# cat ip.txt  #查看新文件的内容  
  11. ip=172.16.10.12  
  12. [root@jie1 ~]#  

2)读取一个文件到正在用sed操作的文件中

[java]  view plain  copy
 
  1. [root@jie1 ~]# cat myfile   #文件内容  
  2. hello world  
  3. i am li  
  4. how are you  
  5. li  
  6. [root@jie1 ~]# cat test  #将用sed操作的文件的内容  
  7. Ethernet  
  8. #BOOTPROTO="dhcp"  
  9. HWADDR="00:0C:29:90:79:78"  
  10. ONBOOT="yes"  
  11. IPADDR=172.16.10.12  
  12. NETMASK=255.255.0.0  
  13. [root@jie1 ~]# sed  -i '/Ethernet/r myfile' test  
  14.       #在匹配Ethernet的行,读进来另一个文件的内容,读进来的文件的内容会插入到匹配Ethernet的行后  
  15. [root@jie1 ~]# cat test  #再次查看用sed命令操作的行  
  16. Ethernet  
  17. hello world  
  18. i am li  
  19. how are you  
  20. li  
  21. #BOOTPROTO="dhcp"  
  22. HWADDR="00:0C:29:90:79:78"  
  23. ONBOOT="yes"  
  24. IPADDR=172.16.10.12  
  25. NETMASK=255.255.0.0  
  26. [root@jie1 ~]#  

sed的经典例子:

[java]  view plain  copy
 
  1. ##1)、处理以下文件内容,将域名取出并进行计数排序,如处理:  
  2. http://www.baidu.com/index.<a target="_blank" href="http://www.2cto.com/kf/qianduan/css/" class="keylink" style="border:none; padding:0px; margin:0px; color:rgb(51,51,51); text-decoration:none; font-size:14px">html</a>  
  3. http://www.baidu.com/1.html  
  4. http://post.baidu.com/index.html  
  5. http://mp3.baidu.com/index.html  
  6. http://www.baidu.com/3.html  
  7. http://post.baidu.com/2.html  
  8. 得到如下结果:  
  9. 域名的出现的次数 域名  
  10. 3 www.baidu.com  
  11. 2 post.baidu.com  
  12. 1 mp3.baidu.com  
  13. [root@localhost shell]# cat file | sed -e ' s/http:\/\///' -e ' s/\/.*//' | sort | uniq -c | sort -rn  
  14. 3 www.baidu.com  
  15. 2 post.baidu.com  
  16. 1 mp3.baidu.com  
  17. [root@codfei4 shell]# awk -F/ '{print $3}' file |sort -r|uniq -c|awk '{print $1"\t",$2}'  
  18. 3 www.baidu.com  
  19. 2 post.baidu.com  
  20. 1 mp3.baidu.com  
  21. ##2)、用grep结合sed取出网卡的ip地址  
  22. [root@jie1 ~]# ifconfig | grep -B1 "inet addr" |grep -v "\-\-" |sed -n -e 'N;s/eth[09].*\n.*addr:[09]{1,3}\.[09]{1,3}\.[09]{1,3}\.[09]{1,3}.*/\1 \2/p'  

学会sed的使用是写自动化shell脚本的基础,sed也是一个非常有用且重要的命令,是文本处理工具之一,以上是我自己学习总结的sed命令简单的用法,sed还有更高级的用法,也还在学习中。














Sed 简介

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

sed 工作过程

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

从上图可以看出 sed 不是破坏性的,它不会修改正在编辑的文件。 

 

Sed 命令格式

1
sed  命令行格式为:  sed  [选项] ‘  command ’ 输入文本

Sed 定位

Sed 命令在没有给定的位置时,默认会处理所有行;
Sed 支持一下几种地址类型:
1、 first~step
这两个单词的意思: first 指起始匹配行, step 指步长,例如: sed -n 2~5p 含义:从第二行开始匹配,隔 行匹配一次,即 2,7,12.......
2、 $
这个$符表示匹配最后一行。
3、 /REGEXP/
这个是表示匹配正则那一行,通过//之间的正则来匹配。
4、 \cREGEXPc
这个是表示匹配正则那一行,通过\c 和 之间的正则来匹配,c 可以是任一字符
5、 addr1, add2 
定址 addr1, add2 决定用于对哪些行进行编辑。地址的形式可以是数字、正则表达式或二者的结合。如果没有指定地址, sed 将处理输入文件中的所有行。如果定址是一个数字,则这个数字代表行号,如果是逗号分隔的两个行号,那么需要处理的定址就是两行之间的范围(包括两行在内)。范围可以是数字,正则或二者组合。

6、 addr1, +N

从 addr1 这行到往下 行匹配,总共匹配 N+1 
7、 addr1, ~N
Will match addr1 and the lines following addr1 until the next line whose input line number is a multiple of N.【没有看懂是什么意思】

Sed 的正则表达式

表 1: sed 的正则表达式元字符

元字符功 能示 例示例的匹配对象
^行首定位符/^love/匹配所有以 love 开头的行
$行尾定位符/love$/匹配所有以 love 结尾的行
.匹配除换行外的单
个字符
/l..e/匹配包含字符 l、后跟两个任意
字符、再跟字母 的行
*匹配零个或多个前
导字符
/*love/匹配在零个或多个空格紧跟着
模式 love 的行
[]匹配指定字符组内
任一字符
/[Ll]ove/匹配包含 love 和 Love 的行
[^]匹配不在指定字符
组内任一字符
/[^A-KM-Z]ove/匹配包含 ove,但 ove 之前的那
个字符不在 至 或 至 
的行
\(..\)保存已匹配的字符
&保存查找串以便在
替换串中引用
s/love/**&**/符号&代表查找串。字符串 love
将替换前后各加了两个**的引
用,即 love 变成**love**
\<词首定位符/\<love/匹配包含以 love 开头的单词的
\>词尾定位符/love\>/匹配包含以 love 结尾的单词的
x\{m\}连续 个 x/o\{5\}/分别匹配出现连续 个字母 o
至少 个连续的 o、或 5~10 
连续的 的行
x\{m,\}至少 个 x/o\{5,\}/
x\{m,n\}至少 个 x,但不
超过 个 x
/o\{5,10\}/

sed的常用选项

表 2.sed 的常用选项

选项说明
-n使用安静模式,在一般情况所有的 STDIN 都会输出到屏幕上,加入-n 后只打印
被 sed 特殊处理的行
-e多重编辑,且命令顺序会影响结果
-f指定一个 sed 脚本文件到命令行执行,
-rSed 使用扩展正则
-i直接修改文档读取的内容,不在屏幕上输出

Sed 操作命令

sed 操作命令告诉 sed 如何处理由地址指定的各输入行。如果没有指定地址, sed 就会处理输入的所有的行。表 3.sed 命令

命 令说 明
a\在当前行后添加一行或多行
c\用新文本修改(替换)当前行中的文本
d删除行
i\在当前行之前插入文本
h把模式空间里的内容复制到暂存缓存区
H把模式空间里的内容追加到暂存缓存区
g取出暂存缓冲区里的内容,将其复制到模式空间,覆盖该处原有内容
G取出暂存缓冲区里的内容,将其复制到模式空间,追加在原有内容后面
l列出非打印字符
p打印行
n读入下一输入行,并从下一条命令而不是第一条命令开始处理
q结束或退出 sed
r从文件中读取输入行
对所选行意外的所有行应用命令
s用一个字符串替换另一个


表 4.替换标志

g在行内进行全局替换
p打印行
w将行写入文件
x交换暂存缓冲区与模式空间的内容
y将字符转换为另一字符(不能对正则表达式使用 命令)


报错信息和退出信息

遇到语法错误时, sed 会向标准错误输出发送一条相当简单的报错信息。但是,如果 sed判断不出错在何处,它会“断章取义”,给出令人迷惑的报错信息。如果没有语法错误, sed将会返回给 shell 一个退出状态,状态为 0 代表成功,为非 0 整数代表失败。

sed使用实例

下面给出测试文件作为输入文件:

1
2
3
4
5
6
7
8
9
10
[root@Gin scripts] # cat ceshi.txt
northwest       NW      Charles Main    3.0     .98     3       34
western         WE      Sharon Gray     5.3     .97     5       23
southwest       SW      Lewis Dalsass   2.7     .8      2       18
southern        SO      Suan Chin       5.1     .95     4       15
southeast       SE      Patricia Hemenway       4.0     .7      4       17
eastern         EA      TB Savage       4.4     .84     5       20
northeast       NE      AM Main Jr.     5.1     .94     3       13
north           NO      Margot Weber    4.5     .89     5       9
central         CT      Ann Stephens    5.7     .94     5       13
打印: p 命令

命令 是打印命令,用于显示模式缓存区的内容。默认情况下, sed 把输入行打印在屏幕上,选项-n 用于取消默认打印操纵。当选项-n 和命令 同时出现时, sed 可打印选定的内容

案例1:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@Gin scripts] # sed '/north/p' ceshi.txt
northwest       NW      Charles Main    3.0     .98     3       34
northwest       NW      Charles Main    3.0     .98     3       34
western         WE      Sharon Gray     5.3     .97     5       23
southwest       SW      Lewis Dalsass   2.7     .8      2       18
southern        SO      Suan Chin       5.1     .95     4       15
southeast       SE      Patricia Hemenway       4.0     .7      4       17
eastern         EA      TB Savage       4.4     .84     5       20
northeast       NE      AM Main Jr.     5.1     .94     3       13
northeast       NE      AM Main Jr.     5.1     .94     3       13
north           NO      Margot Weber    4.5     .89     5       9
north           NO      Margot Weber    4.5     .89     5       9
central         CT      Ann Stephens    5.7     .94     5       13

说明:默认情况下, sed 把所有输入行都打印在标准输出上。如果在某一行匹配到 north, sed就把该行另外打印一遍。 

案例2:

1
2
3
4
[root@Gin scripts] # sed -n '/north/p' ceshi.txt
northwest       NW      Charles Main    3.0     .98     3       34
northeast       NE      AM Main Jr.     5.1     .94     3       13
north           NO      Margot Weber    4.5     .89     5       9

说明:默认情况下, sed 打印当前缓存区中的输入行。命令 p 指示 sed 将再次打印该行。选项-n 取消 sed 取消默认打印操作。选线-n 和命令配合使用,模式缓冲区内的输入行,只被打印一次。如果不指定-n 选项, sed 就会像上例中那样,打印出重复的行。如果指定了-n,则sed 只打印包含模式 north 的行。 

删除: d 命令

命令 d 用于删除输入行。sed 先将输入行从文件复制到模式缓存区,然后对该行执行 sed命令,最后将模式缓存区的内容显示在屏幕上。如果发出的是命令 d,当前模式缓存区的输入行会被删除,不被显示。
案例 3:

1
2
3
4
5
6
7
8
9
[root@Gin scripts] # sed '3d' ceshi.txt
northwest       NW      Charles Main    3.0     .98     3       34
western         WE      Sharon Gray     5.3     .97     5       23
southern        SO      Suan Chin       5.1     .95     4       15
southeast       SE      Patricia Hemenway       4.0     .7      4       17
eastern         EA      TB Savage       4.4     .84     5       20
northeast       NE      AM Main Jr.     5.1     .94     3       13
north           NO      Margot Weber    4.5     .89     5       9
central         CT      Ann Stephens    5.7     .94     5       13

说明:删除第 行。默认情况下,其余的行都被打印到屏幕上。 

案例 4: 

 

1
2
3
[root@Gin scripts] # sed '3,$d' ceshi.txt
northwest       NW      Charles Main    3.0     .98     3       34
western         WE      Sharon Gray     5.3     .97     5       23

说明:删除从第三行到最后一行内容,剩余各行被打印。地址范围是开始第 行,结束最后一行。

案例 5: 

1
2
3
4
5
6
7
[root@Gin scripts] # sed '/north/d' ceshi.txt
western         WE      Sharon Gray     5.3     .97     5       23
southwest       SW      Lewis Dalsass   2.7     .8      2       18
southern        SO      Suan Chin       5.1     .95     4       15
southeast       SE      Patricia Hemenway       4.0     .7      4       17
eastern         EA      TB Savage       4.4     .84     5       20
central         CT      Ann Stephens    5.7     .94     5       13

说明:所有包含模式 north 的行都被动删除,其余行被打印。 

替换: s 命令

命令 s 是替换命令。替换和取代文件中的文本可以通过 sed 中的 s 来实现, s 后包含在斜杠中的文本是正则表达式,后面跟着的是需要替换的文本。可以通过 g 标志对行进行全局替换
案例 6: 

1
2
3
4
5
6
7
8
9
10
[root@Gin scripts] # sed 's/west/north/g' ceshi.txt
northnorth      NW      Charles Main    3.0     .98     3       34
northern                WE      Sharon Gray     5.3     .97     5       23
southnorth      SW      Lewis Dalsass   2.7     .8      2       18
southern        SO      Suan Chin       5.1     .95     4       15
southeast       SE      Patricia Hemenway       4.0     .7      4       17
eastern         EA      TB Savage       4.4     .84     5       20
northeast       NE      AM Main Jr.     5.1     .94     3       13
north           NO      Margot Weber    4.5     .89     5       9
central         CT      Ann Stephens    5.7     .94     5       13

说明:命令用于替换。命令末端的 表示在行内全局替换;也就是说如果每一行里出现多个west,所有的 west 都会被替换为 north。如果没有 命令,则只将每一行的第一 west 替换为 north
案例 7

1
2
[root@Gin scripts] # sed -n 's/^west/north/p' ceshi.txt
northern                WE      Sharon Gray     5.3     .97     5       23

说明:命令用于替换。选线-n 与命令行末尾的标志 结合,告诉 sed 只打印发生替换的那些行;也就是说,如果只有在行首找到 west 并替换成 north 时才会打印此行。
案例 8

1
2
3
4
5
6
7
8
9
10
[root@Gin scripts] # sed 's/[0-9][0-9]$/&.5/' ceshi.txt
northwest       NW      Charles Main    3.0     .98     3       34.5
western         WE      Sharon Gray     5.3     .97     5       23.5
southwest       SW      Lewis Dalsass   2.7     .8      2       18.5
southern        SO      Suan Chin       5.1     .95     4       15.5
southeast       SE      Patricia Hemenway       4.0     .7      4       17.5
eastern         EA      TB Savage       4.4     .84     5       20.5
northeast       NE      AM Main Jr.     5.1     .94     3       13.5
north           NO      Margot Weber    4.5     .89     5       9
central         CT      Ann Stephens    5.7     .94     5       13.5

说明:当“与”符号( &)用在替换串中时,它代表在查找串中匹配到的内容时。这个示例中所有以 位数结尾的行后面都被加上.5
案例 9: 

1
2
[root@Gin scripts] # sed -n 's/Hemenway/Jones/gp' ceshi.txt
southeast       SE      Patricia Jones  4.0     .7      4       17

说明:文件中出现的所有的 Hemenway 都被替换为 Jones,只有发生变化的行才会打印出来。选项-n 与命令 的组合取消了默认的输出。标志 的含义是表示在行内全局替换。

案例 10

1
2
3
4
5
6
7
8
9
10
11
[root@Gin scripts] # sed 's/\(Mar\)got/\1linanne/p' ceshi.txt
northwest       NW      Charles Main    3.0     .98     3       34
western         WE      Sharon Gray     5.3     .97     5       23
southwest       SW      Lewis Dalsass   2.7     .8      2       18
southern        SO      Suan Chin       5.1     .95     4       15
southeast       SE      Patricia Hemenway       4.0     .7      4       17
eastern         EA      TB Savage       4.4     .84     5       20
northeast       NE      AM Main Jr.     5.1     .94     3       13
north           NO      Marlinanne Weber        4.5     .89     5       9
north           NO      Marlinanne Weber        4.5     .89     5       9
central         CT      Ann Stephens    5.7     .94     5       13

说明:包含在圆括号里的模式 Mar 作为标签 保存在特定的寄存器中。替换串可以通过\1 来引用它。则 Margot 被替换为 Marlinane
案例 11: 

1
2
3
4
5
6
7
8
9
10
[root@Gin scripts] # sed 's#3#88#g' ceshi.txt
northwest       NW      Charles Main    88.0    .98     88      884
western         WE      Sharon Gray     5.88    .97     5       288
southwest       SW      Lewis Dalsass   2.7     .8      2       18
southern        SO      Suan Chin       5.1     .95     4       15
southeast       SE      Patricia Hemenway       4.0     .7      4       17
eastern         EA      TB Savage       4.4     .84     5       20
northeast       NE      AM Main Jr.     5.1     .94     88      188
north           NO      Margot Weber    4.5     .89     5       9
central         CT      Ann Stephens    5.7     .94     5       188

说明:紧跟在 命令后的字符就是查找串和替换串之间的分隔符。分隔符默认默认为正斜杠,但可以改变。无论什么字符(换行符,反斜线除外),只要紧跟在 命令,就成了新的串分隔符。这个方法在查找包含正斜杠模式时很管用,例如查找路径名或生日。

指定行的范围:逗号

行的范围从文件中的一个地址开始,在另一个地址结束。地址范围可以是行号(例如5,10),正则表达式(例如/Dick/和/Joe/),或者两者的结合(例如/north/,$)范围是闭合的——包含开始条件的行,结束条件的行,以及两者之间的行。如果结束条件无法满足,就会一直操作到文件结尾。如果结束条件满足,则继续查找满足开始条件的位置,范围重新开始。
案例 12: 

1
2
3
4
5
6
[root@Gin scripts] # sed -n '/west/,/east/p' ceshi.txt
northwest       NW      Charles Main    3.0     .98     3       34
western         WE      Sharon Gray     5.3     .97     5       23
southwest       SW      Lewis Dalsass   2.7     .8      2       18
southern        SO      Suan Chin       5.1     .95     4       15
southeast       SE      Patricia Hemenway       4.0     .7      4       17

说明:打印模式 west 和 east 之间所有的行。如果 west 出现在 east 之后的某一行,则打印的范围从 west 所在行开始,到下一个出现 east 的行或文件的末尾(如果前者未出现)。图中用箭头表示出了该范围。

 

案例 13: 

 

1
2
3
4
[root@Gin scripts] # sed -n '5,/northeast/p' ceshi.txt
southeast       SE      Patricia Hemenway       4.0     .7      4       17
eastern         EA      TB Savage       4.4     .84     5       20
northeast       NE      AM Main Jr.     5.1     .94     3       13

说明:打印从第 行开始第一个以 northeast 开头的行之间的所有行。

案例 14: 

1
2
3
4
5
6
7
8
9
10
[root@Gin scripts] # sed '/west/,/east/s/$/**VACA**/' ceshi.txt
northwest       NW      Charles Main    3.0     .98     3       34**VACA**
western         WE      Sharon Gray     5.3     .97     5       23**VACA**
southwest       SW      Lewis Dalsass   2.7     .8      2       18**VACA**
southern        SO      Suan Chin       5.1     .95     4       15**VACA**
southeast       SE      Patricia Hemenway       4.0     .7      4       17**VACA**
eastern         EA      TB Savage       4.4     .84     5       20
northeast       NE      AM Main Jr.     5.1     .94     3       13
north           NO      Margot Weber    4.5     .89     5       9
central         CT      Ann Stephens    5.7     .94     5       13

说明:修改从模式 wast 和 east 之间的所有行,将各行的行尾($)替换为字符串**VACA**。换行符被移到新的字符串后面。 

多重编辑: e 命令

-e 命令是编辑命令,用于 sed 执行多个编辑任务的情况下。在下一行开始编辑前,所有的编辑动作将应用到模式缓存区的行上。
案例 15: 

1
2
3
4
5
6
7
[root@Gin scripts] # sed -e '1,3d' -e 's/Hemenway/Jones/' ceshi.txt
southern        SO      Suan Chin       5.1     .95     4       15
southeast       SE      Patricia Jones  4.0     .7      4       17
eastern         EA      TB Savage       4.4     .84     5       20
northeast       NE      AM Main Jr.     5.1     .94     3       13
north           NO      Margot Weber    4.5     .89     5       9
central         CT      Ann Stephens    5.7     .94     5       13

说明:选项-e 用于进行多重编辑。第一重编辑编辑删除第 1~3 行。第二重编辑将Hemenway 替换为 Jones。因为是逐行进行这两行编辑(即这两个命令都在模式空间的当前行上执行),所以编辑命令的顺序会影响结果。例如,如果两条命令都执行的是替换,前一次替换会影响后一次替换。

追加: a 命令

a 命令是追加命令,追加将新文本到文件中当前行(即读入模式的缓存区行)的后面。不管是在命令行中,还是在 sed 脚本中, a 命令总是在反斜杠的后面。
案例 16: 

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@Gin scripts] # sed '/^north/a Hello world!' ceshi.txt 
northwest       NW      Charles Main    3.0     .98     3       34
Hello world!
western         WE      Sharon Gray     5.3     .97     5       23
southwest       SW      Lewis Dalsass   2.7     .8      2       18
southern        SO      Suan Chin       5.1     .95     4       15
southeast       SE      Patricia Hemenway       4.0     .7      4       17
eastern         EA      TB Savage       4.4     .84     5       20
northeast       NE      AM Main Jr.     5.1     .94     3       13
Hello world!
north           NO      Margot Weber    4.5     .89     5       9
Hello world!
central         CT      Ann Stephens    5.7     .94     5       13

说明:命令 用于追加。字符串 Hello, World!被加在以 north 开头的各行之后。如果要追加的内容超过一行,则除最后一行外,其他各行都必须以反斜杠结尾。

插入: i 命令

i 命令是插入命令,类似于 a 命令,但不是在当前行后增加文本,而是在当前行前面插入新的文本,即刚读入缓存区模式的行。
案例 17: 

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@Gin scripts] # sed '/eastern/i Hello,world!\
> -----------------------' ceshi.txt
northwest       NW      Charles Main    3.0     .98     3       34
western         WE      Sharon Gray     5.3     .97     5       23
southwest       SW      Lewis Dalsass   2.7     .8      2       18
southern        SO      Suan Chin       5.1     .95     4       15
southeast       SE      Patricia Hemenway       4.0     .7      4       17
Hello,world!
-----------------------
eastern         EA      TB Savage       4.4     .84     5       20
northeast       NE      AM Main Jr.     5.1     .94     3       13
north           NO      Margot Weber    4.5     .89     5       9
central         CT      Ann Stephens    5.7     .94     5       13

说明:命令 i 是插入命令。如果在某一行匹配到模式 eastern,i 命令就在该行的上方插入命令中插入反斜杠后面后的文本。除了最后一行, 

修改: c 命令

c 命令是修改命令。 sed 使用该命令将已有的文本修改成新的文本。旧文本被覆盖。
案例 18:

1
2
3
4
5
6
7
8
9
10
11
12
[root@Gin scripts] # sed '/eastern/c Hello,world! \
> ------------------' ceshi.txt
northwest       NW      Charles Main    3.0     .98     3       34
western         WE      Sharon Gray     5.3     .97     5       23
southwest       SW      Lewis Dalsass   2.7     .8      2       18
southern        SO      Suan Chin       5.1     .95     4       15
southeast       SE      Patricia Hemenway       4.0     .7      4       17
Hello,world!
------------------
northeast       NE      AM Main Jr.     5.1     .94     3       13
north           NO      Margot Weber    4.5     .89     5       9
central         CT      Ann Stephens    5.7     .94     5       13

说明:命令是修改命令。该命令将完整地修改在模式缓冲区行的当前行。如果模式 eastern被匹配, 命令将其后的文本替换包含 eastern 的行。

获取下一行: n 命令

n 命令表示下一条命令。 sed 使用该命令获取输入文件的下一行,并将其读入到模式缓冲区中,任何 sed 命令都将应用到匹配行,紧接着的下一行上。
案例 19: 

1
2
3
4
5
6
7
8
9
10
[root@Gin scripts] # sed '/eastern/{n;s/AM/Archie/;}' ceshi.txt 
northwest       NW      Charles Main    3.0     .98     3       34
western         WE      Sharon Gray     5.3     .97     5       23
southwest       SW      Lewis Dalsass   2.7     .8      2       18
southern        SO      Suan Chin       5.1     .95     4       15
southeast       SE      Patricia Hemenway       4.0     .7      4       17
eastern         EA      TB Savage       4.4     .84     5       20
northeast       NE      Archie Main Jr. 5.1     .94     3       13      ## 此行就是被替换的行
north           NO      Margot Weber    4.5     .89     5       9
central         CT      Ann Stephens    5.7     .94     5       13

说明:如果在某一行匹配到模式 eastern, 命令就指示 sed 用下一个输入行(即包含 AM MainJr 的那行)替换模式空间中的当前行,并用 Archie 替换 AM,然后打印该行,再继续往下处理

转换: y,命令

y 命令表示转换。该命令与 tr 命令相似,字符按照一对一的方式从左到右进行转换。例如 y/abc/ABC/,会把小写字母转换成大写字母, a-->A,b-->B,c-->C。
案例 20: 

1
2
3
4
5
6
7
8
9
10
[root@Gin scripts] # sed '1,3y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' ceshi.txt
NORTHWEST       NW      CHARLES MAIN    3.0     .98     3       34
WESTERN         WE      SHARON GRAY     5.3     .97     5       23
SOUTHWEST       SW      LEWIS DALSASS   2.7     .8      2       18
southern        SO      Suan Chin       5.1     .95     4       15
southeast       SE      Patricia Hemenway       4.0     .7      4       17
eastern         EA      TB Savage       4.4     .84     5       20
northeast       NE      AM Main Jr.     5.1     .94     3       13
north           NO      Margot Weber    4.5     .89     5       9
central         CT      Ann Stephens    5.7     .94     5       13

说明:命令把 1~3 行中所有的小写命令字母都转换成了大写。正则表达式元字符对 命令不起作用。与替分隔符一样,斜杠可以被替换成其他字符。 

退出: q 命令

q 命令表示退出命令。该命令将导致 sed 程序退出,且不再进行其他的处理。

案例 21: 

1
2
3
4
5
6
[root@Gin scripts] # sed '5q' ceshi.txt
northwest       NW      Charles Main    3.0     .98     3       34
western         WE      Sharon Gray     5.3     .97     5       23
southwest       SW      Lewis Dalsass   2.7     .8      2       18
southern        SO      Suan Chin       5.1     .95     4       15
southeast       SE      Patricia Hemenway       4.0     .7      4       17

说明:打印完第 行之后, 让 sed 程序退出。
案例 22

1
2
3
4
[root@Gin scripts] # sed '/Lewis/{ s/Lewis/Joseph/;q; }' ceshi.txt
northwest       NW      Charles Main    3.0     .98     3       34
western         WE      Sharon Gray     5.3     .97     5       23
southwest       SW      Joseph Dalsass  2.7     .8      2       18

说明:在某行匹配到模式 Lewis 时, 表示先用 Joseph 替换 Lewis,然后 命令让 sed 退出。 

生产环境案例

在实际生产中,在修改配置文件的时候,有一些空格、空行、带“ #”开头的注释都要删除或替换,下面为大家介绍几个实用的例子
案例 23

1
2
3
4
5
[root@Gin scripts] # cat sed.txt
  today is  nice  day
  you can walk out on the street
  it will be  import  to you
##每行的前面都有空格
1
2
3
4
5
6
7
8
9
10
[root@Gin scripts] # sed 's/^[ ]*//' sed.txt
today is  nice  day
you can walk out on the street
it will be  import  to you
## 注:[ ]里面有个空格
或者:
[root@Gin scripts] # sed 's/^[[:space:]]*//' sed.txt
today is  nice  day
you can walk out on the street
it will be  import  to you

案例24:删除文本中空行和空格组成的行及#号注释的行 

1
2
3
4
5
6
7
8
[root@Gin scripts] # grep -Eiv "^#|^$" ssh_config
Host *
         GSSAPIAuthentication  yes
         ForwardX11Trusted  yes
         SendEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
         SendEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
         SendEnv LC_IDENTIFICATION LC_ALL LANGUAGE
         SendEnv XMODIFIERS

案例 25从 Google 上下载下来的配置文件往往都带有数字,现在需要删除所有行的首数字。

1
2
3
4
5
6
7
8
[root@Gin scripts] # cat sed.txt
1today is  nice  day
2you can walk out on the street
3it will be  import  to you
[root@Gin scripts] # sed 's/^[0-9][0-9]*//g' sed.txt
today is  nice  day
you can walk out on the street
it will be  import  to you

总结

本章内容总结了 sed 命令的用法,前面部分是 sed 命令的语法,后面部分则主要以实际案例来说明 sed 的用法,最后面一点介绍了 sed 命令在生产实践中的运用。所谓学为练,练为战,希望大家能够将 sed 命令勤加练习,必将会在工作中有所用途,尤其是频繁的分析日志文件, Awk+Sed 是比较好的组合。最后希望本文对大家有所帮助,真正达到熟练的程度这就靠大家在工作中归纳总结了。  


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值