Linux的sed命令

一、初识sed

在部署openstack的过程中,会接触到大量的sed命令,比如

# Bind MySQL service to all network interfaces.
sed -i ‘s/127.0.0.1/0.0.0.0/g‘ /etc/mysql/my.cnf

那么这条命令是什么意思?接下来介绍sed命令答案自然就揭晓了。
二、sed简介

sed:是一个编辑器,是一个强大的文件处理工具。

sed作用:用来替换、删除,更新文件中的内容。sed能自动处理一个或多个文件。

sed原理:sed以文本的行为单位进行处理,一次处理一行内容。首先sed把当前处理的行存储在临时缓冲区中(称为模式空间pattern space),接着处理缓冲区中的行,处理完成后,把缓冲区的内容送往屏幕。sed处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示,这样不断的重复,直到文件末尾。处理完文件的最后一行后,sed便结束运行。

因为sed是对文件中每行在临时缓冲区中的副本进行编辑,所以原文件内容并没有改变,除非重定向输出。
三、sed命令介绍

#sed [-nefri][命令]

参数说明:

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

-n:使用安静(slient)模式,取消默认输出。sed默认会将所有来自stdin的数据输出到终端上。但如果加上-n参数后,不自动打印处理后的结果,只是默默的处理,只有经过sed特殊处理的那一行才被列出来。

-e: --expression直接在命令模式上进行sed的动作编辑。sed -e ‘...‘ -e ‘...‘ -e ‘...‘

-f:指定sed脚本的文件名。

-r:sed动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)

命令说明:[n1][n2]命令

n1,n2:表示行号,该参数可选,一般表示希望操作的行数,可以是数字,正则表达式或二者混合。

用逗号分隔的两个行数表示这两行为起止的行的范围。如1,3表示1,2,3行,美元符号($)表示最后一行。如何没有指定地址,sed将处理输入文件的所有行。地址通常的写法有:n;n,m;n,$。举例,如果我的操作是需要在3到5行之间进行的,则【3,5,[动作行为]】。

命令:

a:新增,在当前行的下一行追加一行文本。

i:插入,在当前行的上一行插入一行文本。

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

d:删除,从模式空间删除一行。

p:打印,打印模式空间的行。通常p会与参数【-n】一起使用。

s:替换,通常s命令可以搭配正则表达式!例如1,20s/old/new/g。
四、举例

下面我们拿Emilia的Big Big World中的部分歌词文件song.txt举例,其内容如下:
复制代码

$ cat song.txt
I‘m a big big girl
In a big big world
It‘s not a big big thing if you leave me
But I do do feel
that I do do will miss you much
Miss you much

复制代码
1、s替换命令

将song.txt文件中每行的第一个big替换为small:

sed ‘s/big/small/‘ song.txt

解释:s:替换命令,/big/:匹配big字符串,/small/:把匹配替换成small。
复制代码

$ sed ‘s/big/small/‘ song.txt
I‘m a small big girl
In a small big world
It‘s not a small big thing if you leave me
But I do do feel
that I do do will miss you much
Miss you much

复制代码

将song.txt文件中每行所有的big替换为small:

sed ‘s/big/small/g‘ song.txt

解释:同上,/g表示一行上替换所有的匹配
复制代码

$ sed ‘s/big/small/g‘ song.txt
I‘m a small small girl
In a small small world
It‘s not a small small thing if you leave me
But I do do feel
that I do do will miss you much
Miss you much

复制代码

Note:这里也可以使用 sed ‘s#big#small#g‘ song.txt  ,紧跟s命令的符号都会被认为是查找串和替换串之间的分隔符,这里使用#,其实无论什么字符串(换行符,反斜线除外),只要紧跟s命令,就成了新的串分隔符。

将song.txt文件中每行第2个big替换为small: sed ‘s/big/small/2‘ song.txt

解释:/2表示指定一行中第2个匹配的字段操作
复制代码

$ sed ‘s/big/small/2‘ song.txt
I‘m a big small girl
In a big small world
It‘s not a big small thing if you leave me
But I do do feel
that I do do will miss you much
Miss you much

复制代码
2、-i参数直接修改文件内容

上面的sed命令没有改变song.txt,只是把处理后的内容输出,如果要写回文件,可以使用重定向。

$ sed ‘s\big\small\g‘ song.txt >song.bak

或使用-i直接修改文件内容:sed -i ‘s\big\small\g‘ song.txt
复制代码

$ sed -i ‘s\big\small\g‘ song.txt
$ cat song.txt
I‘m a small small girl
In a small small world
It‘s not a small small thing if you leave me
But I do do feel
that I do do will miss you much
Miss you much

复制代码

sed 的[-i]参数可以直接修改文件内容,该功能非常有用!

举例来说,如果有一个100万行的文件,要在第100行加某些文字。此时使用vim可能会疯掉!因为文件太大了打不开!但是通过sed直接修改/取代的功能,根本不需要打开文件就能完成任务。和vim相比sed就像会魔术一样,vim要打开文件-操作文件-关闭文件,sed直接隔空就对文件操作了,非常方便。

正因为sed -i 功能强大,可以直接修改原始文件,也是个危险的动作,需小心使用。
3、-e参数编辑命令,进行多行匹配

-e是编辑命令,用于sed执行多个编辑任务的情况下。在下一行开始编辑前,所有的编辑动作都将应用到模式缓冲区中的行上。因为是逐行进行多重编辑(即每个命令都在模式空间的当前行上执行),所以编辑命令的顺序会影响结果。

如果我们要一次替换多个模式,

sed "1,3s/big/small/g; 4,5s/do/don‘t/g" song.txt

解释:第一个模式:把第一行到第三行的big替换成small;第二个模式:把第四行到第五行的do替换成don‘t。
复制代码

$ sed "1,3s/big/small/g; 4,5s/do/don‘t/g" song.txt
I‘m a small small girl
In a small small world
It‘s not a small small thing if you leave me
But I don‘t don‘t feel
that I don‘t don‘t will miss you much
Miss you much

复制代码

上面的命令等价于:sed  -e "1,3s/big/small/g" -e "4,5s/do/don‘t/g" song.txt
复制代码

$ sed  -e "1,3s/big/small/g" -e "4,5s/do/don‘t/g" song.txt  
I‘m a small small girl
In a small small world
It‘s not a small small thing if you leave me
But I don‘t don‘t feel
that I don‘t don‘t will miss you much
Miss you much

复制代码
4、删除命令d:删除匹配的行

命令d删除匹配的输入行,sed先将输入行从文件复制到模式空间里,然后对该行执行sed命令,最后将模式空间的内容显示在屏幕上。如果是命令d,当前模式空间里的输入行会被删除,不被显示。

利用匹配删除行

删除song.txt文件中第一次包含“Miss”的行 :sed ‘/Miss/d‘ song.txt

$ sed ‘/Miss/d‘ song.txt
I‘m a big big girl
In a big big world
It‘s not a big big thing if you leave me
But I do do feel
that I do do will miss you much

下面是利用行号删除行的例子

删除song.txt文件中的第1行:sed ‘1d‘ song.txt

$ sed ‘1d‘ song.txt
In a big big world
It‘s not a big big thing if you leave me
But I do do feel
that I do do will miss you much
Miss you much

删除song.txt文件中2到5行:sed ‘2,5d‘ song.txt

$ sed ‘2,5d‘ song.txt   
I‘m a big big girl
Miss you much

删除song.txt文件中第3行之后的行:sed ‘3,$d‘ song.txt

$ sed ‘3,$d‘ song.txt
I‘m a big big girl
In a big big world

正则匹配可以和行号一起使用,举一个openstack部署中的例子:

删除第一次包含“eth2”的行到最后所有的行:sed -i ‘/eth2/,$d‘ /etc/network/interfaces
5、插入命令a,在当前行后追加一行

a添加新文本到文件中当前行(即读入模式空间中的行)的后面。

在song.txt文件中第3行后插入一行并直接作用于song.txt:sed ‘3a AAAAAAAAAAAAAAAAAAAAAAA‘ song.txt 【用空格作为分隔符】
复制代码

$ sed -i ‘3a AAAAAAAAAAAAAAAAAAAAAAA‘ song.txt
$ cat song.txt
I‘m a big big girl
In a big big world
It‘s not a big big thing if you leave me
AAAAAAAAAAAAAAAAAAAAAAA
But I do do feel
that I do do will miss you much
Miss you much

复制代码

在匹配‘Miss‘的行后插入一行:sed ‘/Miss/a AAAAAAAAAAAAAAAAAAAAAAAAAA‘ song.txt 【用空格作为分隔符】
复制代码

$ sed ‘/Miss/a AAAAAAAAAAAAAAAAAAAAAAAAAA‘ song.txt                                
I‘m a small small girl
In a small small world
It‘s not a small small thing if you leave me
But I do do feel
that I do do will miss you much
Miss you much
AAAAAAAAAAAAAAAAAAAAAAAAAA

复制代码

在song.txt最后插入一行:sed ‘$a append line‘ song.txt
复制代码

$ sed ‘$a append line‘ song.txt
I‘m a big big girl
In a big big world
It‘s not a big big thing if you leave me
But I do do feel
that I do do will miss you much
Miss you much
append line

复制代码
6、插入命令i,在当前行前插入一行

i添加新文本到文件中当前行(即读入模式空间中的行)的前面。

在song.txt文件中第3行后插入一行:sed ‘3i#iiiiiiiiiiiiiiiiiiiiiiiiiii‘ song.txt  【#作为分隔符】
复制代码

$ sed ‘3i#iiiiiiiiiiiiiiiiiiiiiiiiiii‘ song.txt                
I‘m a small small girl
In a small small world
iiiiiiiiiiiiiiiiiiiiiiiiiii
It‘s not a small small thing if you leave me
But I do do feel
that I do do will miss you much
Miss you much

复制代码

在song.txt文件中匹配‘Miss‘的行前面插入一行:sed ‘/Miss/i iiiiiiiiiiiiiii‘ song.txt【空格作为分隔符】
复制代码

$ sed ‘/Miss/i iiiiiiiiiiiiiii‘ song.txt                           
I‘m a small small girl
In a small small world
It‘s not a small small thing if you leave me
But I do do feel
that I do do will miss you much
iiiiiiiiiiiiiii
Miss you much

复制代码
7、新增多行(i行前插入,a行后追加,其他地方一样,以a为例)

插入相同的行,在第2行到第5行之后均插入一行:sed ‘2,5a append one line ‘ song.txt
复制代码

$ sed ‘2,5a append one line ‘ song.txt
I‘m a big big girl
In a big big world
append one line
It‘s not a big big thing if you leave me
append one line
But I do do feel
append one line
that I do do will miss you much
append one line
Miss you much

复制代码

插入不同的行,以\n换行

在第2行后面插入三行:sed ‘2a append one line \nappend two line \nappend three line‘ song.txt
复制代码

[email protected]:~/mytest$ sed ‘2a append one line \nappend two line \nappend three line‘ song.txt   
I‘m a big big girl
In a big big world
append one line
append two line
append three line
It‘s not a big big thing if you leave me
But I do do feel
that I do do will miss you much
Miss you much

复制代码
8、c命令以行为单位替换

把第2到第5行的内容替换为2-5content:sed ‘2,5c 2-5content‘ song.txt

$ sed ‘2,5c 2-5content‘ song.txt
I‘m a big big girl
2-5content
Miss you much

9、p命令显示模式空间的内容

以行为单位显示,

显示song.txt文件中的第2到第5行: sed -n ‘2,5p‘ song.txt

$ sed -n ‘2,5p‘ song.txt
In a big big world
It‘s not a big big thing if you leave me
But I do do feel
that I do do will miss you much

搜索匹配显示:

显示匹配‘Miss‘的行:sed -n ‘/Miss/p‘ song.txt

$ sed -n ‘/Miss/p‘ song.txt
Miss you much

10、-n参数取消默认输出

上面的p命令显示时,用到-n参数,因为sed默认把输入行打印在屏幕上:sed ‘/Miss/p‘ song.txt
复制代码

[email protected]:~/mytest$ sed ‘/Miss/p‘ song.txt    
I‘m a big big girl
In a big big world
It‘s not a big big thing if you leave me
But I do do feel
that I do do will miss you much
Miss you much
Miss you much

复制代码

所以要打印选定内容,用-n配合p来使用。
五、简单正则表达式

^:行首定位符。

$:行尾定位符。

\<:词首定位符。

\>:词尾定位符。

.:匹配除换行以外的单个字符。

*:匹配0个或多个前导字符。

[]:匹配字符集合里的任一字符。

[^] :匹配不在指定字符集合里的任一字符。

时间: 2024-08-10 02:04:37

Linux的sed命令的相关文章

关于linux中sed命令的简单用法

linux中sed的学习和使用 今天突然用到了sed这个命令,就即兴学习了一波突然感觉这个功能还是很强的.sed在#man sed下文档查看解释的是:用于过滤和转换文本的流编辑器.即如下图: 我自己用过这个命令之后感觉对于文档来说可以显示某个区间行,显示结果还可以在段前后添加内容删除,替换内容.但是最后才发现,怎么还能直接修改到文件里不仅仅是显示出来,文件内容直接被修改了. 下面就一一介绍这个有趣的命令,莫急莫急一个一个来. 首先找个文件(没用的文件且有内容,搞坏了系统文件可不好玩了)来当测试文

linux下sed命令对文件执行文本替换

让我们看一下 sed 最有用的命令之一,替换命令.使用该命令,可以将特定字符串或匹配的规则表达式用另一个字符串替换.下面是该命令最基本用法的示例: $ sed -e ‘s/foo/bar/’ myfile.txt 上 面的命令将 myfile.txt 中每行第一次出现的 ‘foo’(如果有的话)用字符串 ‘bar’ 替换,然后将该文件内容输出到标准输出.请注意,我说的是每行第一次出现,尽管这通常不是您想要的.在进行字符串替换时,通常想执行全局替换.也就是说, 要替换每行中的所有出现,如下所示:

linux 之sed命令详解

sed命令详解 sed是什么 sed是linux文本处理三剑客之一,全称 StreamEDitor,非常著名的行编辑器,功能十分强大. sed的工作过程 sed处理文本时每次从文件复制出来一行,放在工作车间,又叫做模式空间,即pattern space,然后与模式进行匹配.如果复制出来的这一行不能被模式匹配到,就默认把这一行输出至标准输出(如果用户明确指定不输出也可以). 如果能被模式匹配到,就对这行数据进行用户指定的编辑操作,编辑完成后可能输出至标准输出,也可能是用户指定的其他操作.这样第一行

Linux之sed命令的使用

Linux系统维护过程中,常通过自动脚本来处理运维方面的工作,而作为运维最常用语言即SHELL来完成脚本.而涉及到替换时我们常使用SED来完成替换工作. 这里简单归纳一下SED的功能,以方便后续脚本中的应用 SED最基本的格式遵循以下形式: sed [OPTION]...{script-only-if-no-other-script} [input-file]... [OPTION]中常用的是-e -i -e 表示被修改后的对象在命令行展示出来,但对象本身实际没有进行修改.你可以理解为仅展现修改

linux系统sed命令解析

1. Sed简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到文件末尾.文件内容并没有 改变,除非你使用重定向存储输出.Sed主要用来自动编辑一个或多个文件:简化对文件的反复操作:编写转换程序等.以下介绍的是Gnu版本的Sed3.02. 2. 定址 可以通过定址来定位你所希望编辑的行,该地址

Linux三剑客——sed命令简述

Linux三剑客--sed13.1 sed介绍 sed--流编辑器(stream editor) sed功能与版本:处理文本文件,日志,配置文件增加.删除.修改.查询sed --version 语法格式:sed [选项] [sed指令] [输入文件]sed -i.bak 's#boy#girl#g' oldboy.txt-i sed命令的参数s sed命令g 小尾巴/修饰 sed命令执行过程13.2 sed命令功能示例 等号'='显示行号 sed = person.txt 单行-输入行号即可 s

linux中sed命令的使用(绝对精华版)

sed命令是linux或者shell编程中常用的筛选.替换命令,如果能熟练使用sed则对经常使用的人来说在工作上是非常有帮助的 下面把sed主要的用法列出来(有错误的地方大家可以指正): p命令只打印第三行,没有-n会在第三行后多打印第三行:sed -n '3p' filename 只打印最后一行:sed -n '$p' filename 只打印10到20行(包括10和20行,若后面数字小于前面数字,则只打印前面数字的行):sed -n '10,20p' filename 打印包含My在行尾的行

玩转LINUX之sed命令详解

Linux sed命令是利用script来处理文本文件. sed可依照script的指令,来处理.编辑文本文件. Sed主要用来自动编辑一个或多个文件:简化对文件的反复操作:编写转换程序等. 执行时,sed会从文件或者标准输入中读取一行,将其复制到缓冲区,对文本编辑完成之后,读取下一行直到所有的文本行都编辑完毕. 所以sed命令处理时只会改变缓冲区中文本的副本,如果想要直接编辑原文件,可以使用-i选项或者将结果重定向到新的文件中. sed命令的基本语法如下: # sed [options] co

Linux之sed命令常见用法

1. sed(stream editor),流编辑器 linux中,主要中sed命令实现对文件的增删改替换查 名称 sed - 用于过滤和转换文本的流编辑器 SYNOPSIS sed [选项]... {script-only-if-no-other-script} [文件]... 常用选项或命令 -i 正式执行操作修改内容 -n 取消默认输出 -e 允许多项编辑 -r 使用扩展正则表达式 = 在文件内容行前增加一行行号 s 查找并替换 g 全局范围 p 打印输出 '/ /p' 正则表达式匹配/