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

mac2025-09-17  33

文章目录

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

前言

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

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

sed能够在一个地方指定所有的编辑指令(查找、替换、删除、插入等),然后通过文件传递一次来执行它们。不必进入每个文件进行修改。 vi/vim针对以上编辑指令(查找、替换、删除、插入等)则需要消耗大量的时间。

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

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.txtfirst~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]/,~7a\111 test.txt 向text.txt中包含数字的指定行下添加111字符串i\ 在当前行之上添加一行或者多行 sed /[0-9]/,~7i\111 test.txt 向test.txt中包含数字的指定行上添加111字符串q 结束或者退出sedQ 结束退出sedc\ 用新文本替换(修改)当前行的文本 sed /[0-9]/,~7c\aa test.txt 用aa代替包含数字的文本h 把模式空间的内容复制到暂存空间H 把模式空间的内容追加到暂存空间g 把暂存空间的内容复制到模式空间(用作替换指定行中指定内容的字符串)G 把暂存空间的内容追加到模式空间(用作向指定行中指定内存追加字符串)-l width 列出非打印字符(结束符$,width表示宽度) sed -n /[0-9]/,+7l2 test.txtp 打印行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标记对行进行全部替换

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

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

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

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

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

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

最新回复(0)