首页 > s-sed(stream editor) 文本填充和编辑 基本使用

s-sed(stream editor) 文本填充和编辑 基本使用

文章目录

        • 前言
        • 语法格式
        • sed 操作地址
        • sed子命令
        • sed正则表达式
        • sed使用实例
          • 打印命令 p
          • 删除命令 d
          • 替换命令 s
          • 指定操作地址的范围 逗号 ,
          • 多重编辑命令 e
          • 下行插入命令 a
          • 上行插入命令 i
          • 修改命令 c
          • 获取下一行命令 n
          • 转换命令 y
          • 退出命令 q
        • 总结

前言

sed是一个“非交互”式的字符流编辑器,能够很好得完成对多个文件的一系列编辑工作。sed提供的功能好像是交互式脚本的自然延伸,它提供的查找和替换程序可以被全局的应用于单个文件或者一组多个文件之中。

sed相对于交互式的vi/vim编辑器的优点是:

  1. sed能够在一个地方指定所有的编辑指令(查找、替换、删除、插入等),然后通过文件传递一次来执行它们。不必进入每个文件进行修改。

    vi/vim针对以上编辑指令(查找、替换、删除、插入等)则需要消耗大量的时间。

  2. sed能够保持整个文档的一致性。可以通过查找某一个特定术语的所有不同的使用方式,使得它们能够变得一致

  3. sed支持编写大量的转换程序

总结:sed能够让我们在批量处理不同模式的文件(查找、替换、删除、插入等)时更为便捷


语法格式

sed [OPTION]... {script-only-if-no-other-script} [input-file]...

在这里插入图片描述

选项 说明

  • -n 使用安静模式,在一般情况所有的 STDIN 都会输出到屏幕上,加入-n 后只打印被 sed 特殊处理的行
  • -e 多重编辑,且命令顺序会影响结果
  • -f 指定一个 sed 脚本文件到命令行执行,
  • -r Sed 使用扩展正则
  • -i 直接修改文档读取的内容,不在屏幕上输出

sed 操作地址

sed在没有指定操作行范围时,默认操作所有行

  • number 仅仅匹配指定的行号,并进行操作;比如使用安静模式,打印某一个文件的第十行sed -n 10p test.txt
  • first~step 匹配从first起始,每隔step行匹配一次;比如sed -n 2~5p test.txt 表示从第二行开始,每隔5行打印一次,即打印:2,7,12,17…行
  • $ 匹配最后一行 sed -n '$'p test.txt
  • /REGEXP/ 这个是表示匹配正则那一行,通过//之间的正则来匹配, sed -n /[0-9]/p test.txt 匹配包含0-9中任意数字的行
  • cREGEXPc 这个是表示匹配正则那一行,通过c 和 c 之间的正则来匹配,c 可以是任一字符 sed -n 'm[0-9]m'p test.txt 匹配包含0-9中任意数字的行
  • 0,addr2 从首行开始,直到找到addr2,这里addr2需要为正则时,0才能够生效;类似于1,addr2从第一行开始。 其中addr2可以为数字,字符串,正则表达式;sed -n 0,/[0-9]/p test.txt ,这里addr2为正则,所以可以从0开始;
  • addr1,+N 从 addr1 这行到往下 N 行匹配,总共匹配 N+1 行;sed -n /[0-9]/,+5p test.txt 从第一个包含数字的行开始向下找5行
  • addr1,~N 从addr1这一行向下匹配,直到匹配行号中包含N的倍数即打印;sed -n /[0-9]/,~7p test.txt ,即匹配包含数字的行号开始,到某一个行号能够被7整除为止

sed子命令

sed子命令主要是操作地址指定的各个行需要执行的方式,如果没有指定操作地址,则默认执行针对所有行

  • = 打印当前筛选出来的行号 sed -n /[0-9]/,~7= test.txt,从test.txt中筛选包含数字的行,且只打印行数
  • a 在当前行下添加一行或者多行 sed /[0-9]/,~7a111 test.txt 向text.txt中包含数字的指定行下添加111字符串
  • i 在当前行之上添加一行或者多行 sed /[0-9]/,~7i111 test.txt 向test.txt中包含数字的指定行上添加111字符串
  • q 结束或者退出sed
  • Q 结束退出sed
  • c 用新文本替换(修改)当前行的文本 sed /[0-9]/,~7caa test.txt 用aa代替包含数字的文本
  • h 把模式空间的内容复制到暂存空间
  • H 把模式空间的内容追加到暂存空间
  • g 把暂存空间的内容复制到模式空间(用作替换指定行中指定内容的字符串)
  • G 把暂存空间的内容追加到模式空间(用作向指定行中指定内存追加字符串)
  • -l width 列出非打印字符(结束符$,width表示宽度) sed -n /[0-9]/,+7l2 test.txt
  • p 打印行
  • r 从文件中读取输入行
  • ! 对所选行之外的所有行应用命令
  • s/regexp/replacement/ 替换命令
  • d 删除行

sed正则表达式

在这里插入图片描述

sed使用实例

制造测试文件如下:top -u ceph -b -n 1|grep PID -A 10 > test.txt

在这里插入图片描述

打印命令 p

命令 p 是打印命令,用于显示模式缓存区的内容。默认情况下, sed 把输入行打印在屏幕上,同时将选定内容也打印出来,选项-n 用于取消默认打印操纵。当选项-n 和命令 p 同时出现时, sed 可打印选定的内容

sed '/27023/p' test.txt

在这里插入图片描述

sed -n '27023/p' test.txt

在这里插入图片描述

删除命令 d

命令 d 用于删除输入行。sed 先将输入行从文件复制到模式缓存区,然后对该行执行 sed命令,最后将模式缓存区的内容显示在屏幕上。如果发出的是命令 d,当前模式缓存区的输入行会被删除,不被显示

sed '27023/d' test.txt 已经删除了2703所在的行,默认会将所有行打印到屏幕

在这里插入图片描述

sed '3,$d' test.txt 使用操作地址的命令,删除从第三行开始到行末的所有行

在这里插入图片描述

sed '/ceph-osd/d' test.txt 删除所有包含ceph-osd字符串的行

在这里插入图片描述

替换命令 s

替换命令s大体的格式为s/regexp/replacement/,s后的第一个字符串包含正则表达式,第二个字符串为需要替换掉的内容;可以使用g标记对行进行全部替换

  1. sed 's/ceph-osd/testsed/g' test.txt 将所有包含ceph-osd的字符串替换为testsed字符串

    在这里插入图片描述

  2. sed -n 's/^2/3/p' test.txt 将所有开头为2的字符串替换为3,并且使用-n和p命令,仅将替换的字符串打印出来

    在这里插入图片描述

  3. sed -n 's/osd$/&.sed/p' test.txt 当“与”符号( &)用在替换串中时,它代表在查找串中匹配到的内容以osd结尾时在其后增加字符串.sed

    在这里插入图片描述

  4. sed -n 's/20/ceph-sed/gp' test.txt 使用g将全局中所有包含20的字符串替换为ceph-sed

    在这里插入图片描述

  5. sed -n 's/(ceph)-osd/1sed/gp' test.txt 包含在圆括号里的模式 ceph 作为标签 1 保存在特定的寄存器中。替换串可以通过1 来引用它。则 ceph-osd 被替换为 cephsed

    在这里插入图片描述

  6. sed -n 's#20#ceph-sed#gp' test.txt sed中s之后的字符就是查找串和替换串之间的分隔符,分隔符默认为正斜杠,但其实只要任意跟在s之后的字符(换行符和反斜线除外)都可以作为分隔符。这个方法在查找包含正斜杠模式时很管用,例如查找路径名或生日

    在这里插入图片描述

指定操作地址的范围 逗号 ,

sed -n '/ceph-mon/,/ceph-mgr/p' test.txt 指定打印从ceph-mon行开始到ceph-mgr行结束

在这里插入图片描述

sed -n '5,/ceph-osd/p' test.txt 打印从第5行开始到ceph-osd所在行结束

在这里插入图片描述

sed -n '5,/ceph-osd/s/osd$/sed/gp' test.txt 从第5行开始到遇到ceph-osd字符串所在行之间,将以osd字符串结尾的行替换为以sed结尾

在这里插入图片描述

多重编辑命令 e

sed -e '1,3d' -e 's/ceph-osd/ceph-sed/g' test.txt 用于 sed 执行多个编辑任务的情况下。在下一行开始编辑前,所有的编辑动作将应用到模式缓存区的行上。因为是逐行进行这两行编辑(即这两个命令都在模式空间的当前行上执行),所以编辑命令的顺序会影响结果。

在这里插入图片描述

下行插入命令 a

a 命令是追加命令,追加将新文本到文件中当前行(即读入模式的缓存区行)的后面。不管是在命令行中,还是在 sed 脚本中, a 命令总是在反斜杠的后面。

sed '/osd$/a hello sed' test.txt 在osd结尾的行的下面追加一行hello sed,同时hello sed前增加一个空格

在这里插入图片描述

上行插入命令 i

i命令类似于a命令,追加新的文本到文件当前行的前面。

sed '/m[a-z][a-z]$/i hello sed' test.txt 在以mon,mgr,mds结尾的行之上增加一行hello world

在这里插入图片描述

修改命令 c

c命令可以将已有的文本进行修改,并覆盖旧文本

sed '/m[a-z][a-z]$/c hello sed' test.txt 将mon,mgr,mds结尾的行修改为hello sed,并覆盖原来的行

在这里插入图片描述

获取下一行命令 n

n 命令表示下一条命令。 sed 使用该命令获取输入文件的下一行,并将其读入到模式缓冲区中,任何 sed 命令都将应用到匹配行,紧接着的下一行上

sed '/mgr$/{n;s/ceph-osd/ceph-sed/;}' test.txt 将以mgr结尾的下一行中,ceph-osd字符串替换为ceph-sed

在这里插入图片描述

转换命令 y

y 命令表示转换。该命令与 tr 命令相似,字符按照一对一的方式从左到右进行转换。例如 y/abc/ABC/,会把小写字母转换成大写字母, a–>A,b–>B,c–>C

sed '1,$y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' test.txt 从头到位,将字符串中小写字母转换为大写字母

在这里插入图片描述

退出命令 q

sed '/mgr$/{n;s/ceph-osd/ceph-sed/;q;}' test.txt 执行到替换mgr行的下一行之后就退出,不继续打印

在这里插入图片描述

总结

sed的命令的优势不必多言,详细看到并实践到这里的伙伴们已经深有体会。在对多个文件进行批量处理的时候Sed的作用无疑是巨大省时得,但是它并不能对多个不同的模式使用同一套规则进行处理。针对不同的字符串模式,sed需要编写不同的匹配串进行处理,这个时候awk就能够华丽登场,取编写匹配规则进行文本处理。关于awk的系统性整理学习,后期将持续进行。

参考博文:

https://www.cnblogs.com/ginvip/p/6376049.html

更多相关:

  • 最近需要在脚本中修改几个配置文件参数且不能影响其他参数,于是想到了sed的强大之处,拿来学学 -i参数表示直接替换并修改文件 -i参数时直接修改文件 sed -i 's/aaa/bbb/g' testfile 将testfile文件中的aaa替换为bbb字符串 删除文件指定行或者某行内容 sed -i '/aaa/d' test...

  • SED单行脚本快速参考(Unix流编辑器) « web2.0ã€äº‘计算ã€é›†ç¾¤ã€é«˜å¯ç”¨æ€§SED单行脚本快速参考(Unix流编辑器)2005年12月29日英文标题:USEFUL ONE-LINE SCRIPT FOR SED (Unix stream editor)原标题:HANDY ONE-LINE...

  • 在DOS窗口执行了一些列命令完成某项工作后,如果要查看都执行了那些命令,该如何办呢?(前提:DOS窗口未关闭的情况下)     一、方法一:使用↑↓箭头上下翻看执行过的命令,此方式适宜执行命令较少的情况; 二、方法二:使用快捷键; F7快捷键查看所有执行过的命令 F3:调出上一条执行过的命令,调出后直接回车即可执行; F...

  • 在windows的DOS操作界面里面,清屏的命令是cls,那么在linux 里面的清屏命令是什么呢?下面笔者分享几种在linux下用过的清屏方法。 1、clear命令、这个命令将会刷新屏幕,本质上只是让终端显示页向后翻了一页,如果向上滚动屏幕还可以看到之前的操作信息。 2、Ctrl+l(小写的L)、这是一个清屏的快捷键,这个是笔者...

  • LINUX下用CTRL+R快速搜索HISTORY历史命令,快速索引到之前使用过的命令行语句 前提是,搜索已经使用的命令,否则是查不出来结果的。 ctrl+r 用途:反向搜索执行过的命令。(reverse-i-search) 1、任何目录下按住ctrl + r 2、输入历史命令中的字符串 ,比如 输入shut 会检索...

  • 刚开始接触linux,总有些简单的问题不知道怎么搞定,先将目前汇总的解决方法叫做"linux入门-1",后续在使用过程中逐步总结。   1. 连接 ADSL : sudo pon dsl-provider 断开 ADSL: sudo poff 查看 ADSL 状态: plog 2. dpkg 命令 dpkg 是 Debia...

  • 文章目录NVME 和 AHCI 性能比较NVME-CLI nvme工具使用1. 安装2. 命令综述3. 基本命令演示4. NVME 固件设备升级...