Sed工具

一、sed是什么

sed 命令是利用脚本来处理文本文件。它可以依照脚本的指令来处理、编辑文本文件。主要用来自动编
辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

二、sed的常用操作选项

常见的 sed 命令选项主要包含以下几种。
-e :表示用指定命令或者脚本来处理输入的文本文件。
-f :表示用指定的脚本文件来处理输入的文本文件。
-h :显示帮助。
-n:表示仅显示处理后的结果,通常和操作的p一起使用。
-i.bak:直接编辑文本文件,并把原始文件保存进原文件名+.bak中。
-r, -E 使用扩展正则表达式
-s 将多个文件视为独立文件,而不是单个连续的长文件流

“操作”用于指定对文件操作的动作行为,也就是 sed 的命令。通常情况下是采用的“[n1[,n2]]”操作参数
的格式。n1、n2 是可选的,代表选择进行操作的行数,如操作需要在 5~ 20 行之间进行,则表示为“5,
20 动作行为”。常见的操作包括以下几种。
a:增加,在当前行下面增加一行指定内容。
c:替换,将选定行替换为指定内容。
d:删除,删除选定的行。
i:插入,在选定行上面插入一行指定内容。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以
ASCII 码输出。其通常与“-n”选项一起使用。
s:替换,替换指定字符。
y:字符转换。

三、如何使用sed

sed -n 'p' 1.txt                #输出所有内容,等同于 cat 1.txt
sed -n '3p' 1.txt	            #输出第 3 行
sed -n '3,5p' 1.txt	            #输出 3~5 行
sed -n '1~2p' 1.txt	            #输出所有奇数行
sed -n '2~2p' 1.txt             #输出所有偶数行
sed -n '1p;3p;5p' 1.txt         #输出1,3,5行
sed -n '2,+3p' 1.txt            #从第2行开始,连续3行进行输出,即输出2~5行

sed -n ‘p’ 1.txt
在这里插入图片描述

sed -n ‘3p’ 1.txt
在这里插入图片描述

sed -n ‘3,5p’ 1.txt
在这里插入图片描述

sed -n ‘1~2p’ 1.txt
在这里插入图片描述

sed -n ‘2~2p’ 1.txt
在这里插入图片描述

sed -n ‘1p;3p;5p’ 1.txt
在这里插入图片描述

sed -n ‘2,+3p’ 1.txt
在这里插入图片描述

1.Sed结合正则表达式输出指定行

格式:
sed -n '/root/p' /etc/passwd 
/root/
**第一个/表示正则开始,第二个/表示正则结束,p是打印改动部分**

代码如下(示例):

sed -n '$p' /etc/passwd                  #输出最后一行
sed -n '/root/p' /etc/passwd             #输出包含root的行
sed -n '/bash$/p' /etc/passwd            #输出以bash结尾的行
sed -n '/s...x/p' /etc/passwd        #输出包含s开头中间经过3个任意数并以x结尾的单词的行
sed -n '/[0-9]/p' /etc/passwd            #输出包含数字的行
sed -n '/^root/p' /etc/passwd            #输出开头为root的行
sed -n '1!p' /etc/passwd                 #第一行不输出,其他全部输出
sed -n '/nologin/!p' /etc/passwd         #输出不包含nologin结尾的行
sed -n '/root/=' /etc/passwd             #显示包含root的行号
sed -n '/root/=;/root/p' /etc/passwd #以分号隔开两个正则,分别显示包含root的内容和对应行号
sed -n '$=' 1.txt                        #显示总共多少行

sed默认不支持扩展正则,如果要支持,需要加-r选项
sed -nr '/^root|^shutdown/p' /etc/passwd #显示以root开头或者shutdown开头的行

sed -n ‘$p’ /etc/passwd在这里插入图片描述

sed -n ‘/root/p’ /etc/passwd
在这里插入图片描述

sed -n ‘/bash$/p’ /etc/passwd
在这里插入图片描述

sed -n ‘/s…x/p’ /etc/passwd
在这里插入图片描述
sed -n ‘/[0-9]/p’ /etc/passwd
在这里插入图片描述

sed -n ‘/^root/p’ /etc/passwd
在这里插入图片描述

sed -n ‘1!p’ /etc/passwd
在这里插入图片描述

sed -n ‘/nologin/!p’ /etc/passwd
在这里插入图片描述

sed -n ‘/root/=’ /etc/passwd
在这里插入图片描述

sed -n ‘/root/=;/root/p’ /etc/passwd
在这里插入图片描述

sed -n ‘$=’ 1.txt
在这里插入图片描述

sed -nr '/^root|^shutdown/p' /etc/passwd

在这里插入图片描述

2.增加内容

格式:
sed '2ihello world' /etc/passwd 
sed '2i\hello world' /etc/passwd #可以在i后面加\,方便阅读
i是在上方插入,a在后方插入
sed '2ihello world' /etc/passwd                     #在第二行之前插入hello world
sed '3i\hello\nworld' /etc/passwd                   #在第三行之前带换行的hello world
sed '1ahello world' /etc/passwd                     #在第一行之后插入hello world
sed '$ahello world' /etc/passwd                     #在最后一行之后插入
sed '2,4a hello world' /etc/passwd                  #在2到4行插入
sed '/we/a hello world' /etc/passwd                 #在包含we这行插入
sed '/we/a hello world;3p;3i shell' /etc/passwd     #在/a后面的部分不会被转义

sed ‘2ihello world’ /etc/passwd
在这里插入图片描述

sed ‘3i\hello\nworld’ /etc/passwd
在这里插入图片描述

sed ‘1ahello world’ /etc/passwd
在这里插入图片描述

sed ‘$ahello world’ /etc/passwd
在这里插入图片描述

sed ‘2,4a hello world’ /etc/passwd
在这里插入图片描述

sed ‘/we/a hello world’ /etc/passwd
在这里插入图片描述

sed ‘/we/a hello world;3p;3i shell’ /etc/passwd
在这里插入图片描述

3.删除

格式:
sed '1d' /etc/passwd 
d为删除选定的行
sed 'd' /etc/passwd                    #删除每一行
sed '1d' /etc/passwd                   #删除第一行(少了root这一行)
sed '1,4d' /etc/passwd                 #删除1到4行
sed '/nologin/d' /etc/passwd           #删除包含nologin的行

echo '' >> /etc/passwd                 #添加特殊符号空格
echo '###' >> /etc/passwd              #添加特殊符号#

sed '/^$/d' /etc/passwd                #删除空行
sed '/^#/d' /etc/passwd                #删除特殊符号#
sed '/^#/d;/^$/d' /etc/passwd          #删除空行和特殊符号

sed ‘d’ /etc/passwd
在这里插入图片描述

sed ‘1d’ /etc/passwd
在这里插入图片描述

sed ‘1,4d’ /etc/passwd
在这里插入图片描述

sed ‘/nologin/d’ /etc/passwd
在这里插入图片描述

sed ‘/^$/d’ /etc/passwd
在这里插入图片描述

sed ‘/^#/d’ /etc/passwd
在这里插入图片描述

sed '/^#/d;/^$/d' /etc/passwd

在这里插入图片描述

4.替换

sed '/^root/ckgc' /etc/passwd
sed '/^root/c\kgc' /etc/passwd
c为替换整行内容,可以加\方便阅读
sed '/^root/ckgc' /etc/passwd      #把以root开头的这行替换为kgc
sed '/root/ckgc' /etc/passwd       #把包含root的行替换为kgc
sed 'ckgc' /etc/passwd             #全文替换

sed -i.bak 'p' /etc/hosts         
#修改原文件的同时生成一个备份文件(这里没有修改,只做了备份)

sed ‘/^root/ckgc’ /etc/passwd
在这里插入图片描述

sed ‘/root/ckgc’ /etc/passwd
在这里插入图片描述

sed ‘ckgc’ /etc/passwd
在这里插入图片描述

5.搜索替换

s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###

替换修饰符:
sed 's/root/ROOT/igp; w /root/1.txt' /tmp/passwd
s为只替换符合要求的字符
g 行内全局替换
p 只显示替换成功的行
I,i 忽略大小写
w /PATH/FILE 将替换成功的行保存至文件中
sed 's/root/ROOT/' /etc/passwd                  #搜索每行第一个root替换为ROOT
sed -n 's/root/ROOT/gp' /etc/passwd             #搜索全局的root替换为ROOT
sed -n 's/o/O/2p' /etc/passwd                   #搜索字母o,仅替换每行第二个o为大写O
sed -n 's/root//gp' /etc/passwd                 #搜索每行第一个root替换为空
sed -n '1,5s/^/#/gp' /etc/passwd                #将1到5行的开头添加#
sed -n 's/\/sbin\/nologin/kgc/gp' /etc/passwd   #转义符\,把/sbin/nologin替换为kgc
sed -n 's@/sbin/nologin@kgc@gp' /etc/passwd     #可以用其他符号@当做转义符,方便阅读

sed -n 's/^sync/#&/gp' /etc/passwd              
# &符号代表当前行中匹配到的完整模式字符串,相当于把sync替换为#sync

sed -n 's/network/ooooo/igp' /etc/passwd        
#不区分大小写的搜索network并替换为ooooo

sed ‘s/root/ROOT/’ /etc/passwd
在这里插入图片描述

sed -n ‘s/root/ROOT/gp’ /etc/passwd
在这里插入图片描述

sed -n ‘s/o/O/2p’ /etc/passwd
在这里插入图片描述

sed -n ‘s/root//gp’ /etc/passwd
在这里插入图片描述

sed -n ‘1,5s/^/#/gp’ /etc/passwd
在这里插入图片描述

sed -n ‘s//sbin/nologin/kgc/gp’ /etc/passwd
在这里插入图片描述

sed -n ‘s/^sync/#&/gp’ /etc/passwd(&符号区别)
在这里插入图片描述

sed -n ‘s/network/ooooo/igp’ /etc/passwd
在这里插入图片描述

6.插入文件

sed '3r /etc/hosts' /etc/passwd    #在第三行添加/etc/hosts文件内容
sed '/2/r /etc/hosts' /etc/passwd  #搜索包含2的行,在符合条件的行后添加/etc/hosts文件内容
sed '$r /etc/hosts' /etc/passwd    #在/etc/passwd末尾添加/etc/hosts文件内容
r代表读取/etc/hosts文件的内容

sed ‘3r /etc/hosts’ /etc/passwd
在这里插入图片描述

sed ‘/2/r /etc/hosts’ /etc/passwd
在这里插入图片描述

sed ‘$r /etc/hosts’ /etc/passwd
在这里插入图片描述

7.另存为到文件

sed 'w /tmp/hosts' /etc/hosts     #将 /etc/hosts 文件中的内容复制到 /tmp/hosts文件中
sed '1w /tmp/hosts' /etc/hosts    #将 /etc/hosts 文件中的第一行写入到 /tmp/hosts 文件

请注意,如果目标文件 /tmp/hosts 已经存在,这些命令会覆盖原有内容。
如果你想将 /etc/hosts 文件的内容追加到 /tmp/hosts 文件末尾,
可以使用 >> 符号来实现,如sed 'w /tmp/hosts' /etc/hosts >> /tmp/hosts。

sed ‘w /tmp/hosts’ /etc/hosts
在这里插入图片描述

sed ‘1w /tmp/hosts’ /etc/hosts
在这里插入图片描述

8.同时编辑

sed -n -e '1p' -e '3p' /etc/passwd     #打印第一行和第三行
sed -ne '1p' -ne '5p' /etc/passwd      #打印第一行和第五行
-e 选项用于指定一个编辑命令,它允许你在同一个 sed 命令中执行多个编辑操作

sed -n -e ‘1p’ -e ‘3p’ /etc/passwd
在这里插入图片描述

sed -ne ‘1p’ -ne ‘5p’ /etc/passwd
在这里插入图片描述

9.分组操作

sed '/root/{s/root/ROOT/;s/x/X/g}' /etc/passwd        
#搜索包含root的行并替换为ROOT且将行中所有的x替换为X

sed -ne '/root/{s/root/ROOT/;s/x/X/g}' -ne '1,10p'/etc/passwd   
#只打印一到十行,匹配逻辑和上个命令相同


echo 123abcxyz |sed -r 's/(123)(abc)(xyz)/\1/'      
#输出字符串123abcxyz到sed中,-r告诉 sed 使用扩展的正则表达式语法,s为替换命令,
\1是反向引用第一个捕获组匹配到的内容,即123
替换命令将整个匹配的字符串 "123abcxyz" 替换为第一个捕获组匹配到的内容 "123"。


ifconfig ens33|sed -rn '2s/.*inet ([0-9.]+) .*/\1/p'
#从ifconfig ens33中选择第二行进行替换操作,匹配.*inet(.表示任意字符,
*表示任意个数),[0-9.]+表示捕获任意[0-9.]的数,
*表示任意个数,\1反向引用,p打印

sed ‘/root/{s/root/ROOT/;s/x/X/g}’ /etc/passwd
在这里插入图片描述

sed -ne ‘/root/{s/root/ROOT/;s/x/X/g}’ -ne ‘1,10p’/etc/passwd
在这里插入图片描述

echo 123abcxyz |sed -r ‘s/(123)(abc)(xyz)/\1/’
在这里插入图片描述

ifconfig ens33|sed -rn ‘2s/.inet ([0-9.]+) ./\1/p’
在这里插入图片描述

10.读取完退出

sed '3q' /etc/passwd         #3q表示处理到第三行时结束
注意:q不要和-i一起使用,以免覆盖源文件

sed ‘3q’ /etc/passwd
在这里插入图片描述

11.sed脚本

H:复制到剪贴板(存储数据到缓存区);
g、G:将剪贴板中的数据覆盖/追加至指定行;
w:保存为文件;
r:读取指定文件;
a:追加指定内容。具体操作方法如下所示。
I,i 忽略大小写
sed '/the/{H;d};$G' 1.txt   
#搜索包含the的行,H用于存储数据,";"用于隔开多个命令,d用于删除匹配的行,$匹配最后一行,
G将缓存里的数据输入到匹配行后

sed '1,5{H;d};13G' 1.txt


sed ‘/the/{H;d};$G’ 1.txt
在这里插入图片描述

sed ‘1,5{H;d};13G’ 1.txt
在这里插入图片描述

#!/bin/sed -f                 
s/root/ROOT/g                   #将全局root替换为ROOT
s/^#//g                         #全局删除所有以#开头的行
s/\/sbin\/nologin/kgc/g         #全局替换/sbin/nologin为kgc
#!/bin/sed -f               
1c hello world                  #将第一行替换为hello world

2{                              #选择第二行把第一个b替换成B并打印
    s/b/B/p
}

/root/{                         #选择包含root的行,把第一个x替换成H,第一个root替换成ROOT
    s/x/H/;
    s/root/ROOT/
}

注意:
sed脚本文件第一行要声明#!/bin/sed -f
不要加单引号
每行的最后不能有空格等多余字符
#号开头为注释
一行有多个命令时用分号隔开
注意:sed的返回值一般情况为0,不管是不是修改成功了,除非是语法错误
所以sed的返回值$?一般不作为sed成功的判断条件

在这里插入图片描述

在这里插入图片描述

12.sed的高级应用

sed -r 's/^( +|:)/#/' /etc/hosts     #-r匹配正则,将以空格或者:开头的行替换成以#开头

word=1111 #定义一个变量 
sed "1a$word" /etc/hosts             #双引号为引用,单引号不引用
sed "\$a$word" /etc/hosts            #在文本末尾插入,根据需要使用转义符\

sed -r ‘s/^( +|:)/#/’ /etc/hosts
在这里插入图片描述
sed ‘1a$word’ /etc/hosts
在这里插入图片描述

sed "\$a$word" /etc/hosts

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值