背景

sed(Stream Editor 流编辑器),作为三剑客的一份子,主要的功能有增删改查。为什么称之为“流”编辑器呢?大家知道:在Linux文件系统中,一切都可以作为文件来处理,比如:配置文件、设备文件、日志等等。sed就类似于工厂流水线作业的车间一样,文件中的每行内容都是生产元件,经过sed车间流水线处理,最终会变成成品。

sed语法格式

同grep一样,sed提供两种方式:

  • stdout | sed [option] “pattern command”
  • sed [option] “pattern command” file

第一种是从文本中直接使用pattern匹配搜索

第二种是从标准输出中处理

语法格式 解释
option 选项
pattern 匹配到对应的内容(找谁?)
command 执行操作/命令,增删改查等(做啥?)

选项

选项 含义
-n 只打印模式匹配的行
-e 指定对应的模式命令,如果只要一个不需要指定
-r 在模式中使用扩展正则表达式
-i 直接修改文件内容

pattern匹配模式

匹配模式 含义
10 command 匹配到第10行
10,20 command 匹配从第10行开始,到第20行结束
/pattern1/ command 匹配到pattern1的行
/pattern1/,/pattern2/ command 匹配到pattern1的行开始,到匹配到pattern2的行结束
10,/pattern1/ command 匹配到从d第10行开始,到匹配到pattern1的行结束
/patttern1/,10 command 匹配到pattern1的行开始,到第10行匹配结束

sed命令-增加&删除

类别 编辑命令 含义
增加 a 行后追加(append)
增加 i 行前追加(insert)
删除 d 删除

练习:

单行插入

sed '5a lemonban' test.txt

多行插入

# \n表示换行符
sed '5i hello\nlemonban' test.txt

删除内容

#删除文件所有内容(不指定匹配模式,默认会匹配到所有行)
sed 'd' test.txt
#删除文件第二行内容
sed '2d' test.txt

sed命令-修改

类别 编辑命令 含义
修改 s#old#new# 将行内第一个old替换为new
修改 s#old#new#g 将行内全部的old替换为new
  • “#”作为定界符,“/”也可以作为定界符,当替换内容有包含定界符时,需要进行转义
  • 如果要修改文件内容,需要加“-i”参数

练习:

修改文件内容,不对源文件起效

#将文件中的lemonban替换成lemon
sed 's#lemonban#lemon#g' person.txt

修改源文件内容

#将文件中的lemonban替换成lemon
sed -i 's#lemonban#lemon#g' person.txt

修改文件指定行对应的内容

#将文件中第二行的lemonban替换成lemon
sed -i '2s#lemonban#lemon#g' person.txt

sed分组替换功能

正则表达式中的分组功能sed也是可以支持的,用()记住正则表达式的一部分,其中,\1为第一个小括号里面的内容,如果还有其他的下括号,那么\2即可第二个,以此类推...,最多记住9个。

实例:

I am yy teacher.这串文本想要保留yy,删除剩余的部分

echo "I am yy teacher." | sed -r 's#I am ([a-z]+) teacher.#\1#g'

给配置文件中某一项配置加注释

sed -r 's#(^test)#\#\1#' file

sed命令-查询

查询相比较是最简单的,sed中的查询相比cat、more命令可以更加精细,例如:

查询文件第二行内容(p即表示查询)

sed -n '2p' test.txt

查询文件1-10行

sed -n '1,10p' test.txt

注意:p查询命令需要和-n参数结合一起使用,如果不使用-n 会输出原来行内容及匹配行的内容,-n表示取消原来行输出

综合实例

用sed取出Linux网卡eth0的IP地址

ifconfig eth0 | sed -rn '2s#^.*addr:(.*) Bcast:.*$#\1#gp'

将/etc/passwd文件中非单词字符替换成空格

sed -r 's#[^a-zA-Z]+# #g' /etc/passwd

问题?使用单引号or双引号区别?

  • 双引号

    把双引号的内容输出出来;如果内容中有命令,变量等,会先把命令,变量解析出结果,然后再输出最终内容来。双引号内命令或变量的写法为命令或变量或$(命令或变量)。
  • 单引号

    所见即所得,将单引号内的内容原样输出,阻止所有字符的转义。

shell三剑客之sed的更多相关文章

  1. shell 三剑客之 sed

    sed 在shell 编程里也很常用,功能强大! 同grep一样,sed提供两种方式: 方式一:stdout | sed [option] "pattern command" 从文 ...

  2. Shell三剑客之sed命令

    Sed简介 Sed是Stream Editor(流编辑器)缩写,是操作.过滤和转换文本内容的强大工具,常用功能有增删改查. Sed命令执行流程 Sed语法格式 Sed [option] ‘[匹配][处 ...

  3. shell 三剑客之 sed pattern 详解

    sed 基础介绍 语法格式 sed 处理过程 sed 选项 cat sed.txt '-p' 打印输出 ,默认输出两次,流输出一次,源文件输出一次 sed 'p' sed.txt -n  只显示处理的 ...

  4. shell 三剑客之 sed 命令详解

    sed 编辑命令 sed 编辑命令对照表 把 /etc/passwd 文件赋值到当前路径下,进行操作 cp /etc/passwd ./ cat -n passwd sed 删除操作 删除 passw ...

  5. shell编程系列13--文本处理三剑客之sed利用sed追加文件内容

    shell编程系列13--文本处理三剑客之sed利用sed追加文件内容 追加用法总结: .a 在匹配行后面追加 .i 在匹配行前面追加 .r 将文件内容追加到匹配行后面 .w 将匹配行写入指定文件 追 ...

  6. shell编程系列12--文本处理三剑客之sed利用sed修改文件内容

    shell编程系列12--文本处理三剑客之sed利用sed修改文件内容 修改命令对照表 编辑命令 1s/old/new/ 替换第1行内容old为new ,10s/old/new/ 替换第1行到10行的 ...

  7. shell编程系列11--文本处理三剑客之sed利用sed删除文本中的内容

    shell编程系列11--文本处理三剑客之sed利用sed删除文本中的内容 删除命令对照表 命令 含义 1d 删除第一行内容 ,10d 删除1行到10行的内容 ,+5d 删除10行到16行的内容 /p ...

  8. shell编程系列10--文本处理三剑客之sed利用sed查询特定内容

    shell编程系列10--文本处理三剑客之sed利用sed查询特定内容 利用sed查找文件内容: pattern种类: .8p .,10p .,+5p ./regexp/p .,/regexp/p . ...

  9. shell编程系列9--文本处理三剑客之sed概述及常见用法总结

    shell编程系列9--文本处理三剑客之sed概述及常见用法总结 sed的工作模式:对文本的行数据一行行处理,如下图 sed(stream editor),是流编辑器,依据特定的匹配模式,对文本逐行匹 ...

随机推荐

  1. [Silverlight 4] Textbox style模擬Textblock 使可以選取、複製

    childwindow 做為訊息視窗,使用textblock,可是textbloc無法選取內容及複製, 就改用textbox假裝成textblock ---原本的textblock <contr ...

  2. 实验吧简单的sql注入3

    今天早上起来发现有人评论说我没更新实验吧sql注入3,主要是因为前段时间都去做bugku去了 但是重做这道题发现以前的姿势不行了,exp()报错不再溢出,现在不能用这个姿势,所以这里重新整理了一遍思路 ...

  3. Jenkins+GitLab+Docker+SpringCloud实现可持续自动化微服务

    本文很长很长,但是句句干货,点赞关注收藏后有惊喜在文末等你 现有混合云平台的场景下,即有线下和线上的环境,又有测试与正式的场景,而且结合了Docker,导致打包内容有所区分,且服务的发布流程复杂起来, ...

  4. Vue组件间通信6种方式

    摘要: 总有一款合适的通信方式. 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有. 前言 组件是 vue.js 最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的 ...

  5. windows系统DOC命令启动或停止服务

    -- 启动服务 -- net start Mysql -- 停止服务 -- net stop Mysql-- 说明:MysqL没有大小写区分.可以直接小写mysql. -- 启动报错(net star ...

  6. Python3+HTMLTestRunner+SMTP生成测试报告后发送邮件

    在前一篇https://www.cnblogs.com/zhengyihan1216/p/11549820.html 中记录了如何生成html格式的报告, 这篇记录下怎么将测试报告通过邮件发出 1.对 ...

  7. LCD编程_显示文字

    在上篇博客中,实现了画点操作,然后在画点的基础上实现了画线.画圆的操作.实际上显示文字也是在画点的基础上实现的. 文字是由点组成的,那么这些点阵是在哪里获得的呢? 随便打开一个内核文件,搜索font, ...

  8. 通过开启子进程的方式实现套接字服务端可以并发的处理多个链接以及通讯循环(用到了subprocess模块,解决粘包问题)

    今日作业:通过开启子进程的方式实现套接字服务端可以并发的处理多个链接以及通讯循环(用到了subprocess模块,解决粘包问题) server(服务端) import socket from mult ...

  9. openpyxl模块

    openpyxl模块 可以对Excel表格进行操作的模块 第三方模块需要下载 pip install openpyxl 配置永久第三方源: D:\Python36\Lib\site-packages\ ...

  10. NOIP 2015 推销员

    洛谷 P2672 推销员 洛谷传送门 JDOJ 2994: [NOIP2015]推销员 T4 JDOJ传送门 Description 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死 ...