目录
文章目录
前言
一.概述
工作原理
二.sed命令
参数:
定址符:
操作:
三.案列
使用 n .=.p 打印
数字,数字
2,$
1~2:
!
分号;
1,+3:
/正则表达式/
分号代表或关系
特殊结构
四.文本替换
文本替换
使用取地址符号 &
五.文本删除
六.插入文本
总结
Liunx中筛选文本时常用的命令,常常会被提及文本三剑客,前文我们学习了文本三剑客中的grep 命令,除了grep命令我们也常用到sed命令,sed命令有着grep命令独有的功能!
一.概述
sed
是一种流编辑器,用于在文本流中进行操作。它可以用来进行文本替换、文本删除、文本提取和文本转换等任务。sed
将输入文本作为流处理,并可以对其进行修改,然后将修改后的文本输出到标准输出或将其重定向到文件中。
sed 的工作流程主要包括读取、执行和显示三个过 程:
sed -参数 '[定址符]' '操作' 文件名
-n :一般配合行号使用,使用-n后,仅显示被处理的行
-i:直接编辑原文件,而不是由屏幕输出,默认不对原文件进行操作
-e:对文本进行多个动作时,使用-e将动作分开执行
-r:使用扩展正则表达式
-f:类似于输出重定向符号,直接将sed动作写入一个文件内
-{} :可组合多个命令,以分好隔开
用于指定sed命令处理的行范围
1,5:对文件的1-5行内容进行处理
2,$:对文件的2到最后一行内容进行处理
1,+3:对文件第1行以及以后的3行内容进行处理
1~2:对文件的1,3,5,7,……的行内容进行处理
/正则表达式/:对任何能够被正则表达式匹配到的行进行处理
增删改查 执行增删改查等动作
s:替换,替换指定字符,一般搭配正则表达式
d:删除,删除选定的行。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;其通常与“-n”选项一起用。
=:打印行号。
a:增加,a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
i:插入,i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
c:行替换,指定行中的所有内容,替换成该选项后面的字符串。
y:字符转换,转换前后的字符长度必须相同。
l(小写):打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)
! :对指定行以外的所有行应用命令
& :代表匹配到的内容
[root@server ~]# sed -n '=;p' sed1.txt
#打印文件中所有内容,并显示行号
#分号;用于将操作命令串联使用
#-e 作用和分号相同 格式为 -e '操作' -e '操作'
[root@server ~]# sed -n '1p' sed1.txt
#打印第一行
one
[root@server ~]# sed -n '3,9p' sed1.txt
# 打印3-9行
three
four
five
six
seven
eight
nine
:对文件第7行到最后一行进行处理
[root@server ~]# sed -n '7,$p' sed1.txt
[root@server ~]# sed -n '2~2p' sed1.txt
#从第2行开始以2为步长打印偶数行
[root@server ~]# sed -n '1!p' sed1.txt
#打印除了第1行的剩余行信息
[root@server ~]# sed -n '4p;6p;8p'
# 打印4 6 8行
[root@server ~]# sed -n '1,+2p' sed1.txt
#打印第一行及以下2行
[root@server ~]# sed -n '/^f/p' sed1.txt
# 以正则条件检索行并打印
#打印以f开头的行 定址符/正则表达式/ 使用正则表达式为条件筛选行并打印(p)
[root@server ~]# sed -n '/t/p' sed1.txt
# 检索包含t的行信息
[root@server ~]# sed -n '/^t/p ; /^f/p'
sed1.txt # 检索以t开头或以f开头
[root@server ~]# sed -n 'p;n' sed1.txt
# 奇数行
#特殊结构n;p 打印偶数行 p;n 打印奇数行 $= 显示行数
sed '行范围s/旧字符串/新字符串/替换标记' 文件名
#s:替换动作 未写行范围代表对全文进行操作
[root@server ~]# sed 's/root/boot/gp' ps #p:仅显示处理过的结果
#g:对文中匹配的内容进行全部替换,不加g表示仅替换找到内容中第一个匹配到的目标
#提换每一行第一个root为admin
[root@server ~]# sed -n 's/root/admin/p' ps
[root@server ~]# sed -n 's/root/admin/2p' ps
[root@server ~]# sed -n 's/\/sbin\/nologin/\/bin\/bash/gp' ps
#由于sed替换命令中自带/格式,当替换的文本中包含/代表路径时需要加转义符\
#为了方便查看,简化命令为:
[root@server ~]# sed -n 's#/sbin/nologin#/bin/bash#gp' ps
#注意:替换内容含有#时不可用此格式
[root@timeserver /]# sed -n '124s/\/var\/www\/html/\/zy/p' /etc/httpd/conf/httpd.conf
[root@timeserver /]# sed -n '129s/\/var\/www/\zy/p' /etc/httpd/conf/httpd.conf
[root@timeserver ~]# sed -n 's/^/#/p' ps
[root@timeserver ~]# sed -n 's/ssh/#&/p' ps
#操作符:&代表匹配到的内容 上述命令中& 代表 匹配到的ssh
# #&:在ssh左侧添加#
[root@timeserver ~]# sed -n 's/^/@&/p;s/$/@&/p' ps
[root@timeserver ~]# sed '1s/^/\n/' ps
#/n 代表转译字符:换行
[root@timeserver ~]# sed 's/[a-z]/\u&/gp' ps
#sed 查询命令中,只有替换文本位置可识别正则表达式,结果位置不可识别
#\u:代表大写字母 不具有一般性,只针对sed命令的结果位置
#&:代表启动正则
[root@timeserver ~]# sed 's/\b[a-z]/\u&/g' ps
# /b:正则表达式中的边界字符,用于匹配单词首部
通过查找内容为空实现删除部分内容
[root@timeserver ~]# sed -n 's/root/ /gp' ps
[root@timeserver ~]# sed -n 's/^.//p' ps
# ^.:代表每第一个字符 .:代表匹配任意一个字符、
#.$:表示最后一个字符
[root@timeserver ~]# sed 's/[^(a-z)(A-Z)(0-9)]//gw t1.txt' ps
[root@timeserver ~]# sed '1d' sos.conf
#删除2-5行:1改为2,5
[root@timeserver ~]# line_number=1
[root@timeserver ~]# sed "${line_number}d" sos.conf
#单引号中的内容会原样输出,$提取变量的作用会在单引号中失效,因此需要使用双引号
[root@server ~]# sed '/^$/d' sos.conf
[root@server ~]# sed '/Options/d' sos.conf
[root@server ~]# sed '/3/ , /5/d' sos.conf
格式
[root@server ~]# sed -i '3i\192.168.48.131 wwwopenlab.com' hosts
sed '行范围a(或i)\新文本' 文件名
[root@server ~]# sed -i '$a\192.168.48.132 www.openlab.com' hosts