0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

干货 | Linux 流编辑器 SED 详解

Linux爱好者 来源:YXQ 2019-08-09 17:47 次阅读

一、流编辑器 sed 与命令 sed

Linux 中,常使用流编辑器 sed 进行文本替换工作。与常使用的交互式编辑器(如vim)不同,sed 编辑器以批处理的方式来编辑文件,这比交互式编辑器快得多,可以快速完成对数据的编辑修改。

一般来说,sed 编辑器会执行以下操作:

1)一次从输入中读取一行数据;

2)根据所提供的编辑器命令匹配数据;

3)按照命令修改流中的数据;

4)将新的数据输出到 STDOUT。

在 sed 编辑器匹配完一行数据后,它会读取下一行数据并重复这个过程,直到处理完所有数据。使用 sed 命令打开一个 sed 编辑器。sed 命令的格式如下:

sed[options]edit_commands[file]#[]中的内容为可选可不选

其中,options 为命令选项,选择不同的 options 可以修改 sed 命令的行为,主要有 3 个选项:

1)-e 选项:在处理输入时,将 script 中指定的编辑命令添加到已有的命令中。通俗的说,就是在 sed 后面直接添加编辑命令:

sed-e'edit_commands'[files]

sed 命令在默认情况下使用的是 -e 选项。当只有一个编辑命令时,-e 选项可以省略;但是当要在一条 sed 语句中执行多个编辑命令时,就需要使用 -e 选项了:

sed-e's/root/ROOT/g;s/bin/BIN/g'/etc/passwd#使用sed同时执行两条编辑命令(本文大部分用例都直接使用/etc/passwd文件)sed-e's/root/ROOT/g'-e's/bin/BIN/g'/etc/passwd#使用sed同时执行两条编辑命令

2)-f 选项:在处理输入时,将 file 中指定的编辑命令添加到已有的命令中:

前面提到,在需要同时执行多条编辑命令时,可以使用 -e 选项。但是当所需要执行的编辑命令数量很多时,每次使用 sed 时一行一行地敲显然不是很方便,这时可以将所用到的 sed 编辑命令写入一个文件,然后使用 sed -f 选项来指定读取该文件:

$catscript.sed$s/root/ROOT/$s/bin/BIN/$s/home/HOME/
sed-fscript.sed/etc/passwd

3)-n 选项:不产生命令输入:

sed-n's/root/ROOT/'/etc/passwd

使用 -n 选项不会将流编辑器的内容输出到 STDOUT,通常将 -n 选项与 p 命令结合起来使用,以只打印被匹配的行。

除了这三个选项外,sed 编辑器还提供了许多命令,用来进行更详细的操作,简单列一下,后面再仔细介绍:

命令 描述
s 文本替换操作
d 删除操作
i 插入操作
a 附加操作
c 将一行文本修改为新的行
y 逐字符替换
p 打印文本行
= 打印行号
w 向文件中写入数据
r 从文件中读取数据

二、使用 sed 命令进行文本替换

sed 使用 s 命令来进行文本替换操作,基本格式如下:

sed's/srcStr/dstStr/'file

其中,srcStr 为想要替换的文本,dstStr 为将要替换成的文本。使用 s 命令时,sed 编辑器会在一行一行地读取文件 file,并在每行查找文本 srcStr,如果找到了,则将该处的 srcStr 替换为 dstStr。

/ 字符为界定符,用于分隔字符串(sed 编辑器允许使用其他字符作为替换命令中的字符串分隔符):

sed's!/bin/bash!/BIN/BASH!'/etc/passwd#使用!作为字符串分隔符

默认情况下,替换命令只会替换掉目标文本在每行中第一次出现的地方。若想要替换掉每行中所有匹配的地方,可以使用替换标记 g。替换标记放在编辑命令的末尾。除了 g 外,还有几种替换标记:

1)数字:指明替换掉第几次匹配到的文本,没有设置这个标记时,默认是替换第一次匹配的文本:

sed's/root/ROOT/2'/etc/passwd

这行命令将 /etc/passwd 文件中每行的第 2 个 root 替换为 ROOT;

2)g:替换所有匹配到的文本:

sed's/root/ROOT/g'/etc/passwd

这行命令将 /etc/passwd 文件中的 root,全部替换为 ROOT;

3)p:打印与替换命令中指定模式(srcStr)相匹配的行:

sed's/root/ROOT/p'/etc/passwd

执行这命令,会在 STDOUT 上看到包含有 root 的行被输出了两次,一次是 sed 编辑器自动输出的;另一次则是 p 标记打印出来的匹配行。

单独地使用 p 标记没什么用处,通常将 p 标记和 -n 选项结合起来使用,这样就可以只输出被匹配替换过的行了:

ed-n's/root/ROOT/gp'/etc/passwd#将/etc/passwd中所有的root都替换成ROOT,并输出被修改的行

注:可以使用 " = " 命令来打印行号,用法与 p 一样。

4)w file:将替换的结果写到文件中,不过只保存被修改的行,与 -n + p 的功能类似:

sed-n's/root/ROOT/gwchange.txt'/etc/passwd#将/etc/passwd中所有的root都替换成ROOT,并将被修改的行保存到文件change.txt中去

三、使用行寻址对特定行进行编辑

默认情况下,sed 编辑器会对文件中的所有行进行编辑。当然,也可以只指定特定的某些行号,或者行范围来进行流编辑,这需要用到行寻址。所指定的行地址放在编辑命令之前:

[address]commands

3.1 使用数字方式进行行寻址

sed 编辑器将文本流中的每一行都进行编号,第一行的编号为 1 ,后面的按顺序分配行号。通过指定特定的行号,可以选择编辑特定的行。举几个例子:

sed'3s/bin/BIN/g'/etc/passwd#将第3行中所有的bin替换成BINsed'2,5s/bin/BIN/g'/etc/passwd#将第2到5行中所有的bin替换成BINsed'10,$s/bin/BIN/g'/etc/passwd#将第10行到最后一行中所有的bin替换成BIN

注:行寻址不止对替换命令有效,对其他命令也都是有效的,后面也会用到。

3.2 使用文本模式过滤器过滤行

sed 编辑器允许指定文本模式来过滤出命令要作用的行,格式如下:

/pattern/command

必须使用斜杠符 " / " 将要指定的文本模式 pattern 包含起来。sed 编辑器会寻找匹配文本模式的行,然后对这些行执行编辑命令:

sed-n'/root/s/bin/BIN/p'/etc/passwd#寻找包含有字符串root的行,并将匹配行的bin替换为BIN

与数字寻址一样,也可以使用文本过滤区间来过滤行:

sed'/pattern1/,/pattern2/edit_command'file

这行命令会在文件 file 中先寻找匹配 pattern1 的行,然后从该行开始,执行编辑命令,直到找到匹配 pattern2 的行。但是需要注意的是,使用文本区间过滤文本时,只要匹配到了开始模式(pattern1),编辑命令就会开始执行,直到匹配到结束模式(pattern2),这会导致一种情况:一个文本中,先匹配到了一对 pattern1、pattern2,对该文本区间中的文本执行了编辑命令;然后,在 pattern2 之后又匹配到了 pattern1,这时就会再次开始执行编辑命令,因此,在使用文本区间过滤时要格外小心。举个例子:

sed-n'/root/,/nologin/s/bin/BIN/p'/etc/passwd

这行命令对 /etc/passwd 进行了两次文本区间匹配,结果如下:

四、使用 sed 命令删除行

sed 编辑器使用 d 命令来删除文本流中的特定行。使用 d 命令时,一般需要带上位寻址,以删除指定的行,否则默认会删除所有文本行:

sed'/root/d'/etc/passwd#删除匹配root的行sed'2,$d'/etc/passwd#删除第2到最后一行

五、使用 sed 命令插入和附加文本

sed 编辑器使用 i 命令来向数据流中插入文本行,使用 a 命令来向数据流中附加文本行。其中:i 命令会在指定行前增加一个新行;a 命令会在指定行后增加一个新行。

需要注意的是,这两个命令都不能在单个命令行上使用(即不是用来在一行中插入或附加一段文本的),只能指定插入还是附加到另一行。命令格式如下:

sed'[address][i|a]\newline'file

newline 中的文本即为将要插入或附加在一行前面或后面的文本。常常使用这两个命令结合行寻址在特定的行前面或后面增加一个新行。举个例子:

sed'i\Insertalinebehindeveryline'/etc/passwd#向数据流的每一行前面增加一个新行,新行的内容为\后面的内容sed'1i\Insertalinebehindthefirstline'/etc/passwd#在数据流的第一行前面增加一个新行sed'3a\Appendalineafterthethirdline'/etc/passwd#在数据流的第三行后面增加一个新行sed'$a\Appendalineinthelastline'/etc/passwd#在数据流的最后一行后面增加一个新行

六、使用 sed 命令修改行

使用命令 c 可以将数据流中的整行文本修改为新的行,与插入、附加操作一样,这要求在 sed 命令中指定新的行,格式如下:

sed'[address][c]\newtext'file

newtext 中的文本为匹配行将要被修改成的文本。

sed'3c\Newtext'/etc/passwd#将数据流中第三行的内容修改为\后面的内容sed'/root/c\Newtext'/etc/passwd#将匹配到root的行的内容修改为\后面的内容sed'2,4c\Newtext'/etc/passwd#将第2到4行的内容修改为\后面的内容,但是不是逐行修改,而是会将这之间的3行用一行文本来替代

注意这里对地址区间使用 c 命令进行修改时,不会逐行修改,而是会将整个区间用一行修改文本替代。

七、使用 sed 命令逐字符转换

使用 y 参数可以按要求对文本进行逐字符转换。格式如下:

[address]y/inchars/outchars/

转换命令会对 inchars 和 outchars 的值进行一对一的映射。inchars 中的第一个字符会被转换成 outchars 中的第一个字符;inchars 中的第二个字符会被转换成 outchars 中的第二个字符;... 直到处理完一行。如果 inchars 和 outchars 的长度不同,则 sed 编辑器会产生一个错误消息。举个例子:

echoabcdefggfedcba|sed'y/acg/ACG/'

输出结果为 AbCdefGGfedCbA。

八、使用 sed 命令处理文件

8.1 向文件中写入数据

前面已经提到过,可以使用 w 命令向文件写入行。格式如下:

[address]wfilename

举个例子:

sed'1,2wtest.txt'/etc/passwd

该语句将数据流的第 1、2 行写入文件 test.txt 中去。

8.2 从文件中读取数据

可以使用 r 命令来将一个文本中的数据插入到数据流中去,与普通的插入命令 i 类似,这也是对行进行操作的,命令格式如下:

[address]rfilename

filename 为要插入的文件。r 命令常结合行寻址使用,以将文本插入到指定的行后面。举个例子:

sed'3rtest.txt'/etc/passwd

这句话将文件 test.txt 中的内容插入到数据流第三行后面去。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11306

    浏览量

    209567
  • SED
    SED
    +关注

    关注

    0

    文章

    25

    浏览量

    27092

原文标题:Linux 流编辑器 sed 详解

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    linux中vi、vim编辑器常用的技巧

    今天浩道跟大家分享硬核干货,关于linux中vi、vim编辑器常用的技巧!
    发表于 09-21 14:04 595次阅读

    如何在Linux上更改默认的crontab编辑器

    在基于 Linux 和 Unix 的系统上,crontab 命令可帮助您安排任务,以便它们可以在指定的时间或间隔在后台自动运行。 首次启动 crontab 时,您将看到一个提示,要求您选择用于编辑 crontab 文件的默认文本编辑器
    发表于 12-26 11:23 6667次阅读

    嵌入式Linux入门(四、Linux下的编辑器—让人爱恨交加的vi)

    嵌入式 Linux入 门第四课,了解 Linux 下的编辑器,掌握 vi 编辑器的使用。
    的头像 发表于 07-04 11:42 1591次阅读
    嵌入式<b class='flag-5'>Linux</b>入门(四、<b class='flag-5'>Linux</b>下的<b class='flag-5'>编辑器</b>—让人爱恨交加的vi)

    常用编辑器之Vim编辑器

    Linux下我们对文本进行编辑,经常用到的编辑器就是Vi/Vim,Vi/Vim命令众多,功能强大,是大多数Linux程序员选择使用的编辑器
    发表于 08-22 09:48

    快速理解linux编辑器sed命令

    编辑器,默认情况下,sed并不会改变原文件本身,而只是对文本流进行修改,并将修改后的结果打印到标准输出中与awk命令一样,sed处理文本时也是以行为单位,每处理完一行就立即打印出来,然后再处理下一行,直至
    发表于 11-30 10:44

    linux文本编辑器工具下载

    linux文本编辑工具:VIM是优秀的开源文本编辑器,是Linux/UNIX用户非常常用的文本编辑工具.
    发表于 06-02 22:30 31次下载

    CentOS下vi编辑器用法大全

    vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。由于对Unix及
    发表于 05-19 15:16 2次下载

    Linux下C编程基础之常用编辑器浅析

    3.2 常用编辑器 3.2.1 进入vi Linux系统提供了一个完整的编辑器家族系列,如Ed、Ex、vi和emacs等。按功能它们可以分为两大类:行编辑器(Ed、Ex)和全屏幕
    发表于 10-18 15:45 0次下载
    <b class='flag-5'>Linux</b>下C编程基础之常用<b class='flag-5'>编辑器</b>浅析

    linux系统教程之Vi编辑器的使用教程免费下载

    用户无论是建立文本文件,还是编写程序、配置系统环境,都要用到文本编辑器Linux操作系统环境下提供了许多文本编辑器,本章重点讲解vi编辑器,启动、保存、退出和其工作模式等内容,并对利
    发表于 12-18 19:09 52次下载
    <b class='flag-5'>linux</b>系统教程之Vi<b class='flag-5'>编辑器</b>的使用教程免费下载

    如何从Linux中探讨Ⅵ编辑器的教学问题

    Linux中文本编辑器访的主要教学方法和常见的教学问题两个方面,探讨了Ⅵ编辑器的教学问题。
    发表于 01-18 15:07 9次下载
    如何从<b class='flag-5'>Linux</b>中探讨Ⅵ<b class='flag-5'>编辑器</b>的教学问题

    基于终端的Linux 编辑器

    我们需要利用文本编辑器来做笔记、写程序,或者编辑系统配置文件来完成一些事情。
    的头像 发表于 03-30 17:42 3054次阅读

    你会使用 Linux 编辑器 vim 吗?

    vim:是一款编辑器,只负责写代码;相当于 windows 的记事本;
    的头像 发表于 05-10 18:21 869次阅读
    你会使用 <b class='flag-5'>Linux</b> <b class='flag-5'>编辑器</b> vim 吗?

    sed用得少?sed常用语法简介

    sed简称编辑器,即stream editor的缩写。sed是一个操作、过滤和转换文本内容的强大工具。
    的头像 发表于 12-18 09:14 2253次阅读

    Zed Code编辑器新增Linux支持

    据悉,Zed代码编辑器是基于Rust语言开发的macOS软件,近期其研发团队宣布已成功实现Linux平台兼容。据悉,今年年初Zed首次发布时并未提供Linux版支持。
    的头像 发表于 05-10 10:31 569次阅读

    vim编辑器如何使用

    Vim编辑器是一个功能强大的文本编辑器,它基于Vi进行改进,并增加了许多新特性。Vim编辑器的使用主要涉及其不同的工作模式及相应操作。以下是Vim编辑器的基本使用方法: 一、Vim
    的头像 发表于 08-30 14:58 453次阅读