|NO.Z.00012|——————————|LinuxShell|——|Linux&Shell&字符截取和替换命令.V10|——|Sed命令|字符串替换|
一、sed命令
### --- sed 主要是用来将数据进行选取、替换、删除、新增的命令,我们看看命令的语法:
~~~ # 选项:
~~~ -n:一般 sed 命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过 sed 命令处理的行输出到屏幕。
~~~ -e:允许对输入数据应用多条 sed 命令编辑。
~~~ -f 脚本文件名: 从 sed 脚本中读入 sed 操作。和 awk 命令的-f 非常类似。
~~~ -r:在 sed 中支持扩展正则表达式。
~~~ -i:用 sed 的修改结果直接修改读取数据的文件,而不是由屏幕输出动作:
~~~ a \:追加,在当前行后添加一行或多行。添加多行时,除最后 一行外,每行末尾需要用“\”代表数据未完结。
~~~ c \:行替换,用 c 后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需用“\”代表数据未完结。
~~~ i \:插入,在当期行前插入一行或多行。插入多行时,除最后 一行外,每行末尾需要用“\”代表数据未完结。
~~~ d:删除,删除指定的行。
~~~ p:打印,输出指定的行。
~~~ s:字串替换,用一个字符串替换另外一个字符串。格式为“行范围 s/旧字串/新字串/g”(和 vim 中的替换格式类似)。
### --- 对 sed 命令大家要注意,
### --- sed 所做的修改并不会直接改变文件的内容(如果是用管道符接收的命
~~~ 令的输出,这种情况连文件都没有),而是把修改结果只显示到屏幕上,
~~~ 除非使用“-i”选项才会直接修改文件。
[root@localhost ~]# sed [选项] ‘[动作]’ 文件名
一、sed行数据操作
### --- 闲话少叙,直奔主题,我们举几个例子来看看 sed 命令到底是干嘛的。
~~~ 假设我想查看下 student.txt的第二行,那么就可以利用“p”动作了:
[root@localhost ~]# sed '2p' student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Tg 99 83 93 91.66
### --- 好像看着不怎么顺眼啊!“p”命令确实输出了第二行数据,
~~~ 但是 sed 命令还会把所有数据都输出一次,这时就会看到这个比较奇怪的结果。
~~~ 那如果我想指定输出某行数据,就需要“-n”选项的帮助了:
[root@localhost ~]# sed -n '2p' student.txt
1 Liming 82 95 86 87.66
### --- 再来看看如何删除文件的数据:
~~~ 删除第二行到第四行的数据
[root@localhost ~]# sed '2,4d' student.txt
ID Name PHP Linux MySQL Average
~~~ 但是文件本身并没有修改
[root@localhost ~]# cat student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Tg 99 83 93 91.66
### --- 再来看看如何追加和插入行数据:
~~~ 在第二行后加入hello
[root@localhost ~]# sed '2a hello' student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
hello
2 Sc 74 96 87 85.66
3 Tg 99 83 93 91.66
### --- “a”会在指定行后面追加入数据,如果想要在指定行前面插入数据,则需要使用“i”动作:
~~~ 在第二行前插入两行数据
[root@localhost ~]# sed '2i hello \
> world' student.txt
ID Name PHP Linux MySQL Average
hello
> world
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Tg 99 83 93 91.66
### --- 如果是想追加或插入多行数据,除最后一行外,每行的末尾都要加入“\”代表数据未完结。
~~~ 再来看看“-n”选项的作用:
~~~ 注:“-n”只查看 sed 命令操作的数据,而不是查看所有数据。
~~~ 只查看 sed 命令操作的数据
[root@localhost ~]# sed -n '2i hello \
> world' student.txt
hello
world
### --- 再来看看如何实现行数据替换,假设李明老师的成绩太好了,
~~~ 我实在是不想看到他的成绩刺激我,那我就可以这样:
[root@localhost ~]# sed -i '2c No such person' student.txt
一、sed字符串替换
### --- “c”动作是进行整行替换的,如果仅仅想替换行中的部分数据,就要使用“s”动作了。
~~~ s 动作的格式是:
[root@localhost ~]# sed ‘s/旧字串/新字串/g’ 文件名
### --- 替换的格式和 vim 非常类似,假设我觉得我自己的 PHP 成绩太低了,
~~~ 想作弊给他改高点,就可以这样来做:
~~~ 在第三行中;把74换成99
[root@localhost ~]# sed '3s/74/99/g' student.txt
ID Name PHP Linux MySQL Average
No such person
2 Sc 99 96 87 85.66
3 Tg 99 83 93 91.66
### --- 这样看起来就比较爽了吧。如果我想把 Tg 老师的成绩注释掉,
~~~ 让他不再生效(没有成绩了吧?补考去吧?)。可以这样做:
~~~ 这里把正则表达式,"^"代表行首
[root@localhost ~]# sed '4s/^/#/g' student.txt
ID Name PHP Linux MySQL Average
No such person
2 Sc 74 96 87 85.66
#3 Tg 99 83 93 91.66
### --- 在 sed 中只能指定行范围,所以很遗憾我在他们两个的中间,
~~~ 不能只把他们两个注释掉,那么我们可以这样:
~~~ 同时把“Liming”和“Tg”替换为空
[root@localhost ~]# sed -e 's/Liming//g ; s/Tg//g' student.txt
ID Name PHP Linux MySQL Average
No such person
2 Sc 74 96 87 85.66
3 99 83 93 91.66
### --- “-e”选项可以同时执行多个 sed 动作,当然如果只是执行一个动作也可以使用“-e”选项,
~~~ 但是这时没有什么意义。
~~~ 还要注意,多个动作之间要用“;”号或回车分割,例如上一个命令也可以这样写:
[root@localhost ~]# sed -e 'sLiming//g
s/Tg/g' student.txt
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
cdv008-shell
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通