linux的sed命令如何使用(linux中sed详细用法)

linux的sed命令如何使用(linux中sed详细用法)

浏览次数:
信息来源: 用户投稿
更新日期: 2025-11-02
文章简介

sed全称(streameditor)流式编辑器,Sed主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等,工作流程如下gt;sed是一种在线的、非交互式的编辑器,它一次处理一行内

2025阿里云双十一服务器活动

sed全称(streameditor)流式编辑器,Sed主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等,工作流程如下

>sed是一种在线的、非交互式的编辑器,它一次处理一行内容,它是文本处理中非常好的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出,或者使用sed-i选项

#-i选项就是将本该输出到屏幕上的内容输出/流入文件中。Sed主要用来自动编辑一个或多个文件,可以将数据行进行替换、删除、新增、选取等特定工作,简化对文件的反复操作,编写转换程序等

2、sed格式

sed[options]'command'file(s);

sed[options]-fscriptfilefile(s);

sed和grep不一样,不管是否找到指定的模式,它的退出状态都是0

只有当命令存在语法错误时,sed的退出状态才不是0

二、sed选项与基本用法

-n:#取消默认的输出(模式空间的内容输出),只打印模式匹配的行;

-i:#inplace,就地编辑,直接修改文件内容;

-V或--version:#显示版本信息

#文件的一行行内容相当与水流,连续两个-e就是设置了两道关卡

[root@aliyun~]#sed''test.txt

[root@aliyun~]#sed-e'3d'-e'1d'test.txt

[root@aliyun~]#sed-rn-e'1,3d'-e'p'test.txt

#也可以将多道关卡写入一个文件中

[root@aliyun~]#catsed.txt

[root@aliyun~]#sed-rn-fsed.txttest.txt

[root@aliyun~]#

2、sed命令组成

命令由”地址+命令“两部分组成,命令如p、d,更多详解第三章节,本节我们主要介绍地址

地址用于决定对流入模式空间的哪些行进行编辑,如果没有指定地址,sed将处理流入模式空间的所有行。

1)数字

sed'1,47d'/etc/passwd2)正则表达式

与grep一样,sed在文件中查找模式时也可以使用正则表达式(RE)和各种元字符。正则表达式是

括在斜杠间的模式,用于查找和替换,以下是sed支持的元字符。

^,$,.,*,[],[^],\<\>,\(\),\{\}

[root@aliyun~]#cattest.txt

[root@aliyun~]#sed-rn'/egon/p'test.txt

[root@aliyun~]cattest.txt

[root@aliyun~]#sed-rn'1,/egon/p'test.txt

[root@aliyun~]egon#p'test.txt

[root@aliyun~]egon#p'test.txt

[root@aliyun~]sed-rn'/egon/p'test.txt

[root@aliyun~]#sed-rn'/egon/p'test.txt

[root@aliyun~]#

如果匹配的正则里有左斜杠,要么将正则转义,要么将c转义

sed:-eexpression#1,char0:nopreviousregularexpression

[root@aliyun~]/etc/egon/666转义c,必须是\c

[root@aliyun~]/etc/egon/666转义c

[root@aliyun~]#sed-ri'//etc/egon/666/s/.*/xxx/'a.txt

[root@aliyun~]#

三、sed常用命令

sed命令告诉sed对指定行进行何种操作,包括打印、删除、修改等。

a在当前行后添加一行或多行

c用新文本修改(替换)当前行中的文本

l会用$符号标识出文件中看不到的字符的位置

n把下一行内容读入模式空间,后续的处理命令处理的都是刚读入的新内容

q结束或退出sed,不会将后续内容读入模式空间

!对所选行以外的所有行应用命令

y将字符转换为另一字符(不支持正则表达式),y/egon/1234/e->1g->2o->3n->4

h把模式空间里的内容复制到暂存缓冲区(覆盖)

H把模式空间里的内容追加到暂存缓冲区

g取出暂存缓冲区的内容,将其复制到模式空间,覆盖该处原有内容

G取出暂存缓冲区的内容,将其复制到模式空间,追加在原有内容后面

N追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码;

x交换暂存缓冲区与模式空间的内容

c\把选定的行改为新的文本;

h拷贝模板块的内容到内存中的缓冲区;

H追加模板块的内容到内存中的缓冲区;

g获得内存缓冲区的内容,并替代当前模板块中的文本;

G获得内存缓冲区的内容,并追加到当前模板块文本的后面;

n读取下一个输入行,用下一个命令处理新的行而不是用第一个命令;

N追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码;

p打印模板块的行。P(大写)打印模板块的第一行;

blable分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾;

tlabelif分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾;

Tlabel错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾;

wfile写并追加模板块到file末尾;

Wfile写并追加模板块的第一行到file末尾;

!表示后面的命令对所有没有被选定的行发生作用;=打印当前行号;

#把注释扩展到下一个换行符以前;

x表示互换模板块中的文本和缓冲区中的文本;

y表示把一个字符翻译为另外的字符(但是不用于正则表达式);

^匹配行开始,如:/^sed/匹配所有以sed开头的行;

$匹配行结束,如:/sed$/匹配所有以sed结尾的行;

.匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d;

*匹配0个或多个字符,如:,love这成**love**;

\<匹配单词的开始,如:/\

\>匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行;

x\{m\}重复字符x,m次,如:/0\{5\}/匹配包含5个0的行;

x\{m,\}重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行;

x\{m,n\}重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行;2、sed的实列

-n选项和p命令一起使用表示只打印那些发生替换的行:

直接编辑文件选项-i,会匹配file文件中每一行的第一个book替换为books

sed-i's/book/books/g'file

使用后缀/g标记会替换每一行中的所有匹配:

当需要从第N处匹配开始替换时,可以使用/Ng:

echosksksksksksk|sed's/sk/SK/2g'

echosksksksksksk|sed's/sk/SK/3g'

echosksksksksksk|sed's/sk/SK/4g'

以上命令中字符/在sed中作为定界符使用,也可以使用任意的定界符

定界符出现在样式内部时,需要进行转义:

sed's//bin//usr/local/bin/g'

删除文件的第2行到末尾所有行:

删除文件中所有开头是test的行:

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

echothisisatestline|sed's/\w\+/[&]/g'

[this][is][a][test][line]

所有以192.168.0.1开头的行都会被替换成它自已加localhost:

sed's/^192.168.0.1/&localhost/'file192.168.0.1localhost

匹配给定样式的其中一部分:

echothisisdigit7inanumber|sed's/digit\([0-9]\)//'

命令中digit7,被替换成了7。样式匹配到的子串是7,\(..\)用于匹配子串,对于匹配到的第一个子串就标记为,依此类推匹配到的第二个结果就是,例如:

echoaaaBBB|sed's/\([a-z]\+\)\([A-Z]\+\)//'

linux的sed命令如何使用,linux中sed详细用法

sed-n's/\(love\)able/rs/p'file

sed'表达式'|sed'表达式'等价于:

sed表达式可以使用单引号来引用,但是如果表达式内部包含变量字符串,就需要使用双引号。

echohelloWORLD|sed"s/$test/HELLO"

所有在模板test和check所确定的范围内的行都被打印:

sed-n'/test/,/check/p'file

打印从第5行开始到第一个包含以test开始的行之间的所有行:

对于模板test和west之间的行,每行的末尾用字符串aaabbb替换:

sed'/test/,/west/s/$/aaabbb/'file

-e选项允许在同一行里执行多条命令:

sed-e'1,5d'-e's/test/check/'file

上面sed表达式的第一条命令删除1至5行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。

和-e等价的命令是--expression:

sed--expression='s/test/check/'--expression='/love/d'file

file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面:

在example中所有包含test的行都被写入file里:

sed-n'/test/wfile'example

将thisisatestline追加到以test开头的行后面:

sed'/^test/a hisisatestline'file

在test.conf文件第2行之后插入thisisatestline:

sed-i'2a hisisatestline'test.conf

i\命令将thisisatestline追加到以test开头的行前面:

sed'/^test/i hisisatestline'file

在test.conf文件第5行之前插入thisisatestline:

sed-i'5i hisisatestline'test.conf

如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续:

sed'/test/{n;s/aa/bb/;}'file

把1~10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令:

sed'1,10y/abcde/ABCDE/'file

打印完第10行后,退出sedsed'10q'file保持和获取:h命令和G命令在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。

在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。

互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换:

sed-e'/test/h'-e'/check/x'file

sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。

sed[options]-fscriptfilefile(s)

sed-n'1~2p'test.txt偶数行

awk'/SCC/{getline;print}'3、sed命令示例

删除命令:d,注意用单引号

只删除模式匹配成功的第一行

[root@hzl~]只删除模式匹配成功的所有行

[root@hzl~]只删除模式匹配成功的第一行

#sed-r's/egon/Bigegon/'a.txt

#sed-r's/egon/Bigegon/g'a.txt

#sed-r's/^egon/Bigegon/g'a.txt

#sed-r-n's/root/egon/gip'/etc/passwd

&代表取到匹配成功的整行内容

#sed-r's/^([a-zA-Z]+)([^[a-zA-Z]+)//'a.txt

在前一个-e的基础之上进行第二个-e操作

#sed-r'1,3d;s/[Ee]gon/EGON/g'a.txt

;分隔依次运行,先针对第一行进行p操作,再针对所有行进行p操作

只针对第一行,连续进行两次p操作

在匹配成功的行后添加文件b.txt的内容

在第2行后面添加文件b.txt的内容

将匹配成功的行写入新文件b.txt

将第3行到最后一行写入/root/new.txt

#sed-r'2i1111111111111'/etc/hosts

#sed-r'2c1111111111111'a.txt

把下一行内容读入模式空间:n

将匹配/^Egon/成功的行的下一行读入模式空间进行s处理

[root@aliyun~]/etc/egon/666#n;c1111'a.txt

1到3行进行转换对应规则:a->1e->2o->X

匹配成功/[Ee]gon/则执行{}内命令,q代表退出,即替换一次则退出,如果文件中多行符合规则的内容也只替换了第一个

四、模式空间与保持空间

1、sed有两个内置的存储空间:

1)模式空间(patternspace):

如你所知,模式空间用于sed执行的正常流程中。该空间sed内置的一个缓冲区,用来存放、修改从输入文件读取的内容。

2)保持空间(holdspace):

保持空间是另外一个缓冲区,用来存放临时数据。Sed可以在保持空间和模式空间交换数据,但是不能在保持空间上执行普通的sed命令。

2、模式空间与保持空间的操作命令

x:命令x(exchange)用于交换模式空间和保持空间的内容

h:模式空间复制/覆盖到保持空间

H:模式空间追加到保持空间

g:保持空间复制/覆盖到模式空间

G:保持空间追加到模式空间

n:读取下一行到/覆盖到模式空间

N:将下一行添加到模式空间

d:删除patternspace中的所有行,并读入下一新行到patternspace中3、示例(交换文件的行)

#======================方式2:======================思路:

#1、读取文件第一行内容到模式空间,进行的操作如下

#将模式空间内容覆盖到保持空间

#2、读取文件第二行内容到模式空间,进行的操作如下

#将保持内容追加到模式空间

#将模式空间内容覆盖到保持空间

#3、读取文件第三行内容到模式空间,进行的操作如下

#将保持空间内容追加到模式空间

sed-r'1h;1d;2G;2h;2d;3G'test.txt

sed'1!G;h;$!d'test.txt

五、sed脚本

sed脚本就是写在文件中的一系列sed命令,使用-f选项指定sed脚本文件名,需要注意的问题如下

  • 脚本末尾不能有任何多余的空格或文本

  • 如果命令不能独占一行,就必须以\结尾

  • 脚本中不能使用引号,除非它们是查找串的一部分

  • [root@egon~]永久存储,存了多行sed命令,相当于多道关卡,每读入一行内容将经历一道道关卡

    [root@egon~]#sed-r''a.txt

    [root@egon~]#sed-r-fsed.shtest.txt

    [root@egon~]#

    六、sed使用练习

    sed-r-i'/^[ ]*#/d'file.conf

    删除配置文件中用双斜杠//注释的行

    sed-r'/^[ ]*$/d'file.conf

    sed-r'/^[ ]*$/d'file.conf

    sed-r-i'/^[ ]*#/d;/^[ ]*$/d'/etc/vsftpd/vsftpd.conf

    追加一行,\可有可无,有更清晰

    sed-r-i'$a\chroot_local_user=YES'/etc/vsftpd/vsftpd.conf

    sed-r-i'10,$s/^/#/'filename

    sed-r'3,$s/^/'filename换成一个#

    也可以加引号,但注意是双引号而不是单引号,因为要用$符号取变量值

    也可以sed命令用''引起来,而变量用"",注意二者之间不能有空格

    以上就是linux的sed命令如何使用的详细内容,更多请关注主机测评网其它相关文章!

    标签:
    高效网络和系统管理员的7个习惯(网络系统管理员职责)
    « 上一篇
    返回列表
    下一篇 »

    如本文对您有帮助,就请抽根烟吧!