文章目录
- 一、sed是什么
- 二、sed的常用操作选项
- 三、如何使用sed
- 1.Sed结合正则表达式输出指定行
- 2.增加内容
- 3.删除
- 4.替换
- 5.搜索替换
- 6.插入文件
- 7.另存为到文件
- 8.同时编辑
- 9.分组操作
- 10.读取完退出
- 11.sed脚本
- 12.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替换为#syncsed -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替换为Xsed -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 world2{ #选择第二行把第一个b替换成B并打印s/b/B/p
}/root/{ #选择包含root的行,把第一个x替换成H,第一个root替换成ROOTs/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