sed 是文本处理工具,读取文本内容,根据指定的条件进行处理,如删除、替换、添加等;可在无交互的情况下实现相当复杂的文本处理操作

工作原理:读取👉执行👉显示

读取:sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区(又称模式空间,pattern space)

执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。

显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完之前上述过程将重复执行

注:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非使用 ''sed -i" 修改文件源、或使用定向输出到新的文件中

sed 命令是一种流编辑器读取文件会进行逐行读取加上指令操作,所以过大的文件一定要拆分后再交给sed处理

基本操作格式:

sed-e '操作' 文件1  文件2

执行多条命令的格式:

sed-e '操作1' -e '操作2' 文件

sed命令的常用选项

-e 或--expression==:表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用

-f 或 --file==:表示指定的脚本文件来处理输入的文本文件

-h 或--help: 显示帮助

-i 直接修改目标文本文件

-n 仅显示script处理后的结果

sed命令的操作符

s:替换,替换指定字符

d:删除,删除选定的行

a:增加,在当前行下面增加一行指定内容

i:插入,在选定行上面插入一行指定内容

c:替换,将选定行替换为指定内容

y:字符转换,转换前后的字符长度必须相同

p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与 "-n" 选项一起使用

r:高级正则表达式

加上p,会打印两行 

 -n 禁止了默认输出,就只有一行

打印时对行号的操作 

按照行号寻求内容

sed  -n   '1p'   文件名    --打印第一行

sed  -n   '4p'  文件名     --打印第四行

sed  -n   '$p'  文件名     --打印最后一行

进行行号范围区间的打印

sed  -n  '1,3p'  文件名   --打印1-3行

sed  -n  '5,$p'  文件名   --打印第五行到最后一行

sed  -n  '2,+2p'   文件名  -- 打印第二行+两行的内容,相当于'2,4p'

指定间隔打印

sed  -n  -e  '2p'  -e'$p'  文件名    --打印第二行和最后一行

sed  -n  -e  '2p'   -e'3p'  文件名   --打印第二行和第三行

对奇数和偶数行的打印

sed  -n  'n;p'  文件名  --打印偶数的行

sed  -n  'p;n' 文件名   -- 打印奇数的行

这里的n 就是指定高级模式的意思,n在p前面,跳过一行,打印下一行,就是偶数行;在后面,就是打印第一行,然后跳过一行,形成奇数行

文本模式过滤行内容

对包含的字符串进行过滤打印

sed  -n  '/o/p'  文件名    --包含o的所有行

sed  -n  '/th/p'  文件名   --包含th的所有行

应用基础正则表达式进行打印

sed  -n  '/^root/p'  /etc/passwd   --以root为开头的所有内容,全文本搜索

sed  -n  '/bash$/p'   /etc/passwd  --以bash结尾的所有内容,全文本搜索

sed   -n '4,/bash$/p'  /etc/passwd  --从第四行开始,一直打印到第一个以bash为结尾的所在行

删除操作

sed -i 时会对文本进行实际操作

通过行号进行删除

sed  -n  '3d;p'  文件名  --删除第三行,打印剩余的所有内容

sed  -n  '2,5d;p'  文件名  --删除第2到5行,打印剩余的内容

sed  -n  '5,$d;p'  文件名   --删除第5行到最后一行,打印剩余的内容

sed  -n  '5,$!d;p'  文件名   -- 打印第5行到最后一行,其他的全部删除

匹配字符串删除内容

sed  '/one/d'  文件名    ---删除包含one的行

sed  '/one/,/six/d'  文件名   --删除one -six的行

sed  '/one/,/six/!d'  文件名     ---删除除了one-six的行,其余的全部删除

sed  '/one/!d'   文件名    --除了one的行,其余的全部删除

字符串搭配正则进行删除

sed '/^$/d'  文件名   --通过^$,来删除空行;

替换

替换标记

数字:表明新字符串将替换第几处匹配的地方

g:表明新字符串将会替换所有匹配的地方

p:打印与替换命令匹配的行,与-n一起使用

w文件:将替换的结果写入文件中

s:替换,替换指定字符

c:替换,将选定行替换为指定内容

y:字符转换,转换前后的字符长度必须相同

sed  -n  's/root/test/2p'   文件名     ---指定每行的第二个root,替换为test

sed  -n  's/root/test/gp'   文件名     ---所有的root都替换为test

sed   -n  '/^root/  s/^/#/p'    文件名     --以root开头的注释掉

字母字符进行大小写的替换

sed  's/[A-Z]/\l&/g'  文件名   --将大写全部转换成小写,l&是转换小写的一种特殊的符号,前面要加转义符  '\'

sed   's/[a-z]/\u&/'  文件名   ---首字母大写

sed   's/[a-z]/\u&/g'  文件名    ---末尾加g ,全部转成大写  

整行替换

sed  '/one/c  rr' 文件名  --所有包含one 的行,整行被替换成rr

单字符的替换

使用有y,是对单个字符进行替换,每个字符都需要逐一对应,不是整体替换。前后字符串长度需要一致,不然会报错

sed 增加

a:在行后添加内容

sed /one/a zzz  文件名

i:在行前插入内容

sed /one/i zzz  文件名

r:在行后读入文件内容

sed '$r test2.txt'   test1.txt        ---先读取test2.txt的内容,再把test2 .txt的所有内容插入到test1.txt的末行

   

Logo

更多推荐