在前头讲述vim的时候,提到了vim的末行命令(ex模式命令)就是sed命令(文本编辑工具),它和grep命令(文本搜索)、awk命令(文件格式化工具)并称为文本处理三剑客。当在vim中时,我们可以通过在编辑模式下输入“:”来使用一些命令,而这些命令也可以通过“sed”命令来在shell命令行模式下使用。sed命令全名为:Stream EDitor(流编辑器),以行为单位对一个或多个文件进行编辑处理。每一次sed都会处理给定文件中的一行内容。在sed处理文本时,将正在处理的当前行存储到临时的缓冲区中,称为“模式空间”;用当前行去匹配给定的PATTERN,如果能匹配,则使用command编辑处理;如果不匹配,则默认输出至标准输出;然后继续处理下一行,直到文件的末尾。与此相似的是在bash脚本中的“while read LINES”命令,举例如下:

首先创建一个文本,包含以下内容:

[root@localhost 20170610]# cat test
qwe
asd
zxc

然后创建包含如下内容的脚本并运行:

[root@localhost 20170610]# cat whileReadLine
#!/bin/bash
while read LINES
do
echo $LINES
done <./test
[root@localhost 20170610]# bash whileReadLine
qwe
asd
zxc

在这里我们可以看到“while”将“./test”文件中的内容按行读入并进行处理。

但是这种方法过于麻烦,所以我们需要一个更加方便、快捷,功能更加强大的方法——“sed”命令。

sed命令:

sed - stream editor for filtering and transforming text

sed [OPTION]... 'script' [input-file]...

常用选项:

-n, --quiet, --silent:对于不能匹配模式的行,默认不输出到屏幕;

-e script, --expression=script:多条件编辑;

-f script-file, --file=script-file:从指定的script-file中读取脚本

注意:script-file为一个能够定位到脚本文件的路径,最好为绝对路径

-i[SUFFIX], --in-place[=SUFFIX]:原文件直接编辑操作;

注意:默认情况下,sed的所有处理行为不会影响源文件的内容;

-r, --regexp-extended:使sed支持扩展正则表达式;

script:

'AddressesCommand'

Addresses(地址定界):

1.空地址:对所有文件的所有行进行处理;

2.单地址:sed对于能够匹配该地址的那唯一一行进行处理;

num:表示行号;

/pattern/:能够匹配该模式的所有行;

$:表示文档最后一行

3.地址范围:

addr1,addr2:从addr1开始到addr2结束的中间所有行;

例如:2,8:从第二行到第八行

first~step:从first标记的行号开始,以step所代表的数字为步长;

例如:2~5:第2行和第7(2+5)行

addr1,+N:从addr1开始,包括addr1所在行,并继续向后计算N行;

例如:2,+7相当于2到9(2+7)行

addr1,~N:从addr1开始,包括addr1所在行,向后计算N的大于addr1的最小整数倍的行;

例如:2,~5相当于从第2行到第5行

又例如:3,~4相当于从第3行到4的大于3的最小倍数(也就是4)行

还例如:5,~3相当于从第5行到3的大于5的最小倍数(也就是6)行

/pattern1/,/pattern2/:从被pattern1匹配的第一行开始计算,一直到被/pattern2/匹配到的第一行结束;

Command(处理命令):

=:显示被模式匹配的行的行号

例如:sed -n '/^$/=' /etc/grub2.cfg

a \text:在被模式匹配的行的后面追加text的内容,支持使用\n换行,从而实现多行追加;

i \text:在被模式匹配的行的前面插入text的内容,支持使用\n换行,从而实现多行插入;

c \text:将被模式匹配的行的修改为text的内容,支持使用\n换行,从而实现一行变多行;

d:在模式空间中删除被模式匹配的行;这样的行不能再进行标准输出;

注意:在使用d命令的时候,不宜使用-n选项;

p:显示模式空间中被模式匹配的行;

注意:在使用p命令的时候,通常会搭配-n选项;

w filepath:将模式空间中被模式匹配的行,另存到filepath文件中;

r filepath:将filepath文件的内容追加至模式空间中被模式匹配的行之后;

!Command:在模式空间中被模式匹配的行,不执行Command命令;相反,未被模式匹配的行,参会执行Command命令

s///:查找替换,分隔符可以任意更换,只要相同即可;

s@@@, s###, s,,,

s/pattern/text/[control]

s@/etc/fstab@/etc/mtab@

pattern:计划查找并替换的内容

text:要替换的结果

control:如何进行替换,可用的选项有:

g:行内全部替换

p:显示替换成功的行

w filepath:将替换成功的行另存到filepath文件中;

支持后向引用:

s/\(string\)/&/

s/\(string\)/\1/

高级编辑命令:

h: 把模式空间中的内容覆盖至保持空间中

H:把模式空间中的内容追加至保持空间中

g: 从保持空间取出数据覆盖至模式空间

G:从保持空间取出内容追加至模式空间

x: 把模式空间中的内容与保持空间中的内容进行互换

n: 读取匹配到的行的下一行覆盖至模式空间

N:追加匹配到的行的下一行至模式空间

d: 删除模式空间中的行

D:删除多行模式空间中的所有行

示例:

sed -n 'n;p' FILE

sed '1!G;h;$!d' FILE

sed '$!N;$!D' FILE

sed '$!d' FILE

sed ‘G’ FILE

sed ‘g’ FILE

sed ‘/^$/d;G’ FILE

sed 'n;d' FILE

sed -n '1!G;h;$p' FILE

对于这个sed命令,在使用的时候需要将选项和sed命令中的处理命令结合起来使用,一些常用的功能举例如下:

首先创建一个文本文件,包含以下内容:

[root@localhost 20170611]# cat test11root:x:0:0:root:/root:/bin/bash2bin:x:1:1:bin:/bin:/sbin/nologin3daemon:x:2:2:daemon:/sbin:/sbin/nologin4adm:x:3:4:adm:/var/adm:/sbin/nologin5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6sync:x:5:0:sync:/sbin:/bin/sync7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8halt:x:7:0:halt:/sbin:/sbin/halt9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@localhost 20170611]#

使用这个命令,会显示匹配到的行,因为加上了“-n”选项,所以仅仅输出一个匹配到的行号“7”,在单引号中的两个斜杠之间是匹配的模式,使用正则表达式来匹配

[root@localhost 20170611]# sed -n '/shutdown/=' test1
7
[root@localhost 20170611]#

“p”命令

如果想要显示行中的内容,使用“p”命令,显示第五行:

[root@localhost 20170611]# sed -n '5p' test15lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

还可以显示其他的行,具体的使用请查看上面提到的地址定界:

[root@localhost 20170611]# sed -n '1,5p' test11root:x:0:0:root:/root:/bin/bash2bin:x:1:1:bin:/bin:/sbin/nologin3daemon:x:2:2:daemon:/sbin:/sbin/nologin4adm:x:3:4:adm:/var/adm:/sbin/nologin5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost 20170611]# sed -n '1~5p' test11root:x:0:0:root:/root:/bin/bash6sync:x:5:0:sync:/sbin:/bin/sync
[root@localhost 20170611]#

“a”命令

在第二行的下面添加内容(此时需要去掉“-n”选项才能更清楚的看到效果):

[root@localhost 20170611]# sed '2a abcd' test11root:x:0:0:root:/root:/bin/bash2bin:x:1:1:bin:/bin:/sbin/nologin
abcd3daemon:x:2:2:daemon:/sbin:/sbin/nologin4adm:x:3:4:adm:/var/adm:/sbin/nologin5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6sync:x:5:0:sync:/sbin:/bin/sync7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8halt:x:7:0:halt:/sbin:/sbin/halt9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@localhost 20170611]#

还可以同时在多行下同时加上内容,同时在第二行到第四行的下面加上内容:

[root@localhost 20170611]# sed '2,4a abcd' test11root:x:0:0:root:/root:/bin/bash2bin:x:1:1:bin:/bin:/sbin/nologin
abcd3daemon:x:2:2:daemon:/sbin:/sbin/nologin
abcd4adm:x:3:4:adm:/var/adm:/sbin/nologin
abcd5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6sync:x:5:0:sync:/sbin:/bin/sync7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8halt:x:7:0:halt:/sbin:/sbin/halt9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@localhost 20170611]#

如果想要在同一行的下面同时加上多行,使用“\n”进行换行:

[root@localhost 20170611]# sed '2,4a abcd\nefg' test11root:x:0:0:root:/root:/bin/bash2bin:x:1:1:bin:/bin:/sbin/nologin
abcd
efg3daemon:x:2:2:daemon:/sbin:/sbin/nologin
abcd
efg4adm:x:3:4:adm:/var/adm:/sbin/nologin
abcd
efg5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6sync:x:5:0:sync:/sbin:/bin/sync7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8halt:x:7:0:halt:/sbin:/sbin/halt9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@localhost 20170611]#

“i”命令与“a”命令几乎相同,“a”命令是在一行的后面添加一行,“i”命令是在一行的前面添加一行,在这里就不再举例

“c”命令

这个命令可以用来进行内容的替换,比如将第二行的内容替换掉:

[root@localhost 20170611]# sed '2c abcd' test11root:x:0:0:root:/root:/bin/bash
abcd3daemon:x:2:2:daemon:/sbin:/sbin/nologin4adm:x:3:4:adm:/var/adm:/sbin/nologin5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6sync:x:5:0:sync:/sbin:/bin/sync7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8halt:x:7:0:halt:/sbin:/sbin/halt9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@localhost 20170611]#

同“a”等命令相似,这个命令也可以同时修改多行,比如同时替换第三行到第四行的内容,不过替换后的内容只会显示一次,不会重复:

[root@localhost 20170611]# sed '3,4c abcd' test11root:x:0:0:root:/root:/bin/bash2bin:x:1:1:bin:/bin:/sbin/nologin
abcd5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6sync:x:5:0:sync:/sbin:/bin/sync7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8halt:x:7:0:halt:/sbin:/sbin/halt9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@localhost 20170611]#

“d”命令

删除特定的行,比如删除第三行到第六行:

[root@localhost 20170611]# sed '3,6d' test11root:x:0:0:root:/root:/bin/bash2bin:x:1:1:bin:/bin:/sbin/nologin7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8halt:x:7:0:halt:/sbin:/sbin/halt9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@localhost 20170611]#

删除第二行到最后一行:

[root@localhost 20170611]# sed '2,$d' test11root:x:0:0:root:/root:/bin/bash
[root@localhost 20170611]#

“s”命令

这个命令可以用来进行字符的替换,比如将文本中的所有“:”替换成“@@@”:

[root@localhost 20170611]# sed 's/:/@@@/g' test11root@@@x@@@0@@@0@@@root@@@/root@@@/bin/bash2bin@@@x@@@1@@@1@@@bin@@@/bin@@@/sbin/nologin3daemon@@@x@@@2@@@2@@@daemon@@@/sbin@@@/sbin/nologin4adm@@@x@@@3@@@4@@@adm@@@/var/adm@@@/sbin/nologin5lp@@@x@@@4@@@7@@@lp@@@/var/spool/lpd@@@/sbin/nologin6sync@@@x@@@5@@@0@@@sync@@@/sbin@@@/bin/sync7shutdown@@@x@@@6@@@0@@@shutdown@@@/sbin@@@/sbin/shutdown8halt@@@x@@@7@@@0@@@halt@@@/sbin@@@/sbin/halt9mail@@@x@@@8@@@12@@@mail@@@/var/spool/mail@@@/sbin/nologin10uucp@@@x@@@10@@@14@@@uucp@@@/var/spool/uucp@@@/sbin/nologin
[root@localhost 20170611]#

如果替换后头的字符为空,就可以当成删除的命令,比如去掉“@@@”即为删除“:”:

[root@localhost 20170611]# sed 's/://g' test11rootx00root/root/bin/bash2binx11bin/bin/sbin/nologin3daemonx22daemon/sbin/sbin/nologin4admx34adm/var/adm/sbin/nologin5lpx47lp/var/spool/lpd/sbin/nologin6syncx50sync/sbin/bin/sync7shutdownx60shutdown/sbin/sbin/shutdown8haltx70halt/sbin/sbin/halt9mailx812mail/var/spool/mail/sbin/nologin10uucpx1014uucp/var/spool/uucp/sbin/nologin
[root@localhost 20170611]#

有点时候“/”这个符号会重复,此时我们可以换一个符号,只要三个一样即可,比如将所有的“/”替换为“$”:

[root@localhost 20170611]# sed 's@/@$@g' test11root:x:0:0:root:$root:$bin$bash2bin:x:1:1:bin:$bin:$sbin$nologin3daemon:x:2:2:daemon:$sbin:$sbin$nologin4adm:x:3:4:adm:$var$adm:$sbin$nologin5lp:x:4:7:lp:$var$spool$lpd:$sbin$nologin6sync:x:5:0:sync:$sbin:$bin$sync7shutdown:x:6:0:shutdown:$sbin:$sbin$shutdown8halt:x:7:0:halt:$sbin:$sbin$halt9mail:x:8:12:mail:$var$spool$mail:$sbin$nologin10uucp:x:10:14:uucp:$var$spool$uucp:$sbin$nologin
[root@localhost 20170611]#

在上面的例子中我都是使用的字符串进行匹配,但是在实际的使用中我们可以将字符串替换为正则表达式来进行匹配(正则表达式查看原先的博客)

转载于:https://blog.51cto.com/11142243/1940533

sed文本数据流处理命令相关推荐

  1. 几个常用的文本处理shell 命令:find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk

    内容目录: find 文件查找 grep 文本搜索 xargs 命令行参数转换 sort 排序 uniq 消除重复行 用tr进行转换 cut 按列切分文本 paste 按列拼接文本 wc 统计行和字符 ...

  2. 高级sed编程1--多行命令

    如果在shell命令行当中有多个命令的话,最好使用{}将命令包含在其中: 1 多行命令 1.1next命令 1.1.1 单行next命令 小写的n命令告诉sed编辑器移动到数据流文本的下一行,而不是回 ...

  3. linux文本处理常用命令

    linux文本处理常用命令 linux文本处理命令:grep.sed.printf.awk 1.grep grep的作用是按行查找字符,输出包含字符的行. #从文件查询 grep 'hello' fi ...

  4. 打开高效文本编辑之门_Linux sed之多行命令与循环命令

    Linux sed之多行命令与循环命令使用案例 声明与简介 sed:Stream Editor文本流编辑,sed是一个"非交互式的"面向字符流的编辑器. sed模式匹配是对文件的一 ...

  5. 打开高效文本编辑之门_Linux Sed模拟常见文件命令

    Linux sed 实现grep cat wc tail命令的效果对比案例 声明与简介 sed:Stream Editor文本流编辑器,sed是一个"非交互式的"面向字符流的编辑器 ...

  6. sed基本用法 sed文本块处理 、 sed高级应用

    sed 文本编辑器(vim) 增,删,改,查 特色:流处理器[逐行处理的流处理器] 各种编辑器notepad,notepad++,word,atom vim,vi,gedit,sed 非交互的(sed ...

  7. sed的选项及命令详解!

    sed的选项及命令详解 2019年05月13日 17:32:52 huaying927 阅读数 165更多 分类专栏: 云计算 linux sed 是一个比较古老的,功能十分强大的用于文本处理的流编辑 ...

  8. 文本查找查找命令的grep 、egrep、fgrep用法的详解

    文本查找查找命令的grep .egrep.fgrep用法的详解 一.学习目标 了解并能熟悉运用grep.egrep.fgrep命令. 二.学习内容 1.grep.egrep.fgrep命令的意思和用法 ...

  9. 文本编辑器中命令行参数的应用

    文章目录 1 文本编辑器中命令行参数的应用 1 文本编辑器中命令行参数的应用 我们要知道对于每一个应用程序我们都能够接收命令行参数,那么对于GUI系统中命令行参数如何传递到应用程序呢? 主要有如下两种 ...

最新文章

  1. 视频处理单元Video Processing Unit
  2. 学生管理系统(C语言版)
  3. 对信号与系统课程的意见与建议
  4. 2018年1月29日
  5. SAP配置webdynpro完全手册 .
  6. 实例讲解如何通过Oracle成功发送邮件-入门基础
  7. theano中的Rop和Lop的详细解释
  8. java动态代理_Java中的动态代理一
  9. Delphi 中的字符串函数(6) - StrUtils 中的 Ansi 字符串函数
  10. pytorch torch.zeros
  11. 【公测】智能便捷稳定 新版家园只为给你不一样的体验~
  12. 在进行了解JAVA CLASS文件解析时必须要明白的三个概念
  13. 一种巧妙且简单的数据增强方法 - MixUp 小综述
  14. 小额现金贷用户群体分析及风控体系搭建
  15. oracle怎么同步时间设置,【oracle数据库获取当前时间】
  16. 关于DNF的多媒体包NPK文件的那些事儿(6) - IMGV4
  17. win10提升性能的服务器,win10专业版设置优化提高系统性能图解
  18. php龙之战争游戏搭建教程,龙之战争1.02正式版下载
  19. **DNS中A记录和CNAME记录的区别(转)
  20. Fluent多组分设置及化学反应

热门文章

  1. eclipse 安装反编译软件jadclipse
  2. 通过动态获取cookie爬取国家企业信用信息公司系统
  3. DOMJavaScript示例练习
  4. JavaScript数组sort()方法小结
  5. 解决在linux环境下面不显示验证码的问题
  6. Windows 10 x64 安装 Visual Basic 6.0 SP6
  7. SVN的安装配置(一)
  8. DB2时间函数 实现 时间加减
  9. Windows Phone 用WebBrowser加载HTML页面
  10. 5G时代,为什么主流大厂纷纷布局这项技术?