sed用法

说明:本篇文章来自老男孩,这里只做备份记录


功能说明

Sed是Stream Editor(流编辑器)缩写,是操作、过滤和转换文本内容的强大工具。常用功能有增删改查,过滤,取行。

[root@oldboy ~]# sed --version  #→ sed软件版本

GNU sed version 4.2.1

语法格式

sed [options] [sed-commands] [input-file]

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

说明:

1. 注意sed和后面的选项之间至少有一个空格。

2. 为了避免混淆,本文称呼sed为sed软件。sed-commands(sed命令)是sed软件内置的一些命令选项,为了和前面的options(选项)区分,故称为sed命令。

3. sed-commands既可以是单个sed命令,也可以是多个sed命令组合。

4. input-file(输入文件)是可选项,sed还能够从标准输入如管道获取输入。

命令执行流程

概括流程:Sed软件从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行……

模式空间:sed软件内部的一个临时缓存,用于存放读取到的内容。

使用范例

1. 统一实验文本

# 创建包含下面内容的文件,后面的操作都会使用这个文件。

[root@oldboy ~]# cat person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

2. 增删改查

2.1 增

a 追加文本到指定行后

i 插入文本到指定行前

2.1.1 单行增加

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

101,oldboy,CEO

102,zhangyao,CTO

106,dandan,CSO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

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

101,oldboy,CEO

106,dandan,CSO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

2.1.2 多行增加

[root@oldboy ~]# sed '2a 106,dandan,CSO\n107,bingbing,CCO' person.txt

101,oldboy,CEO

102,zhangyao,CTO

106,dandan,CSO #→第1种写法

107,bingbing,CCO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@oldboy ~]# sed '2a 106,dandan,CSO \

> 107,bingbing,CCO' person.txt

101,oldboy,CEO

102,zhangyao,CTO

106,dandan,CSO #→第2种写法

107,bingbing,CCO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

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

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

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

Port 52113

PermitRootLogin no

PermitEmptyPasswords no

UseDNS no

GSSAPIAuthentication no

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

指定执行的地址范围

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

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

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

例子:

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

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

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

1~2{sed-commands}      对1,3,5,7,……行操作

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

/oldboy/{sed-commands}        对匹配oldboy的行操作

/oldboy/,/Alex/{sed-commands}  对匹配oldboy的行到匹配Alex的行操作

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

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

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

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

2.2 删

d 删除指定的行

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

[root@oldboy ~]#

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

101,oldboy,CEO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@oldboy ~]# sed '2,5d' person.txt

101,oldboy,CEO

[root@oldboy ~]# sed '3,$d' person.txt

101,oldboy,CEO

102,zhangyao,CTO

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

102,zhangyao,CTO

104,yy,CFO

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

104,yy,CFO

105,feixue,CIO

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

101,oldboy,CEO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@oldboy ~]# sed '/oldboy/,/Alex/d' person.txt

104,yy,CFO

105,feixue,CIO

[root@oldboy ~]# sed '/oldboy/,3d' person.txt

104,yy,CFO

105,feixue,CIO

企业案例2:打印文件内容但不包含oldboy

[root@oldboy ~]# sed '/oldboy/d' person.txt #→删除包含"oldboy"的行

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

2.3 改

2.3.1 按行替换

c 用新行取代旧行

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

101,oldboy,CEO

106,dandan,CSO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

2.3.2 文本替换

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

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

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

sed软件替换模型(方框▇被替换成三角▲)

sed -i 's/▇/▲/g' oldboy.log

sed -i 's#▇#▲#g' oldboy.log

观察特点

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

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

s#▇#▲#g,▇能用正则表达式,但▲不能用,必须是具体的。

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

[root@oldboy ~]# sed 's#zhangyao#oldboyedu#g' person.txt

101,oldboy,CEO

102,oldboyedu,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@oldboy ~]# cat person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@oldboy ~]# sed -i 's#zhangyao#BBB#g' person.txt

[root@oldboy ~]# cat person.txt

101,oldboy,CEO

102,BBB,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@oldboy ~]# sed -i 's#oldboyedu#zhangyao#g' person.txt #→还原测试文件

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

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

[root@oldboy ~]# sed '3s#0#9#' person.txt

101,oldboy,CEO

102,zhangyao,CTO

193,Alex,COO

104,yy,CFO

105,feixue,CIO

2.3.3 变量替换

[root@oldboy ~]# cat test.txt #→再新建一个文本

a

b

a

[root@oldboy ~]# x=a

[root@oldboy ~]# y=b

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

a b

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

b

b

b

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

a

b

a

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

b

b

b

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

b

b

b

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

b

b

b

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

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

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

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

oldboy

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

oldboy

[root@oldboy ~]# echo I am oldboy teacher. |sed -r 's#I (.*) (.*) teacher.#\1\2#g'

amoldboy

命令说明

思路:用oldboy字符替换I am oldboy teacher.

下面解释用□代替空格

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

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

□tea.*$–>表示以空格tea起始,任意字符结尾,实际就是匹配oldboy字符串后,紧接着的字符串□teacher.;

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

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

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

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

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

crond          0:off  1:off  2:on    3:on    4:on    5:on    6:off

network        0:off  1:off  2:on    3:on    4:on    5:on    6:off

rsyslog        0:off  1:off  2:on    3:on    4:on    5:on    6:off

sshd            0:off  1:off  2:on    3:on    4:on    5:on    6:off

sysstat        0:off  1:on    2:on    3:on    4:on    5:on    6:off

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

[root@oldboy ~]# sed '1,3s#C#--&--#g' person.txt #→此处&等于C

101,oldboy,--C--EO      #→将1到3行的C替换为--C--

102,zhangyao,--C--TO

103,yy,--C--OO

104,feixue,CFO

105,dandan,CIO

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

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

[root@oldboy test]# ls

stu_102999_1_finished.jpg stu_102999_2_finished.jpg stu_102999_3_finished.jpg stu_102999_4_finished.jpg stu_102999_5_finished.jpg

要求用sed命令重命名,效果为stu_102999_1_finished.jpg==>stu_102999_1.jpg,即删除文件名的_finished

2.4 查

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

2.4.1 按行查询

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

101,oldboy,CEO

102,zhangyao,CTO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@oldboy ~]# sed -n '2p' person.txt

102,zhangyao,CTO

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

102,zhangyao,CTO

103,Alex,COO

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

[root@oldboy ~]# sed -n '1~2p' person.txt

101,oldboy,CEO

103,Alex,COO

105,feixue,CIO

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

101,oldboy,CEO

102,zhangyao,CTO

103,yy,COO

104,feixue,CFO

105,dandan,CIO

2.4.2 按字符串查询

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

102,zhangyao,CTO

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

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

2.4.3 混合查询

[root@oldboy ~]# sed -n '2,/CFO/p' person.txt

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

[root@oldboy ~]# sed -n '/feixue/,2p' person.txt

105,feixue,CIO

#→特殊情况,前两行没有匹配到feixue,就向后匹配,如果匹配到feixue就打印此行。

博文首发张耀的博客:http://www.zyops.com/commands-sed

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • 一、sed命令介绍: 1、含义:Stream Editor文本流编辑,sed是一个“非交互式的”面向字符流的编辑器...
    优果馥斯阅读 16,728评论 0 1
  • 1.创建文件夹 !/bin/sh mkdir -m 777 "%%1" 2.创建文件 !/bin/sh touch...
    BigJeffWang阅读 9,834评论 3 53
  • 一、涉及命令及知识分析 1.1解题思想探讨 拿到一个题,或者接手一项任务,我们首先应该怎么做? PMP学习举例,办...
    温东阅读 3,263评论 2 4
  • Linux 系统命令及其使用详解( 大全) 名称: cat 使用权限:所有使用者 使用方式:cat [-AbeEn...
    小向资源网阅读 1,482评论 0 3
  • 如果真的能接受自己就好了,就不会有那么多的愤怒。朝向别人的愤怒,是自己的心在不满,对于生活还有当下,都是不满的,所...
    穆勒书信时光阅读 327评论 2 1