1、sed命令说明

sed主要是用来将数据进行选取、替换、删除、新增的命令,grepawksed称为是文本操作三剑客。

我们看看sed命令的语法格式:

[root@localhost ~]# 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选项才会直接修改文件。

小说明:

vim可以直接修改文件内容,我们使用的也非常多,为什么还要学sed命令呢?

因为vim需要我们手动和计算机交互,需要手动输入一些编辑指令,保存指令,切换模式指令等,才能完成vim的编辑操作。

在Shell中很难做到人机交互,所以vim操作没有办法在Shell程序使用,因此要通过sed命令来完成,这是Shell中修改文件内容最最最主要的方式。

2、行数据操作

使用如下文本student.txt

ID      Name    Python  Linux   MySQL   Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96,66
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33

(1)查看文件中的数据

我们举几个例子来看看sed命令到底是干嘛的。

查看下student.txt文件的第二行,那么就可以利用p动作,执行如下命令:

[root@localhost tmp]# sed '2p' student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96.66
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33

从上面的结果可以看出,p命令确实输出了第二行数据,但是sed命令还会把所有数据都输出一次,这时就会看到这个比较奇怪的结果,第二行的数据有两次的输出。

那如果想指定输出某行数据,就需要-n选项的帮助。

[root@localhost tmp]# sed -n '2p' student.txt
1 Tangs 88 87 86 85.55

(2)删除文件中的数据

删除student.txt文本中第二行到第四行的数据,命令如下:

[root@localhost tmp]# sed  '2,4d' student.txt
ID Name Python Linux MySQL Java
4 Shahs 66 65 64 63.33

2,4表示删除2至4行的数据。

但是这里要注意的是,我上边的操作,并没有写入到文件中,我们可以查看student.txt文本中的内容:

[root@localhost tmp]# cat student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96.66
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33

可以看到student.txt文本中的内容还在,sed命令只是在输出的时候,把数据过滤掉了。

如果需要在删除内容的同时,再写入文件,就需要-i选项了。

执行命令:

[root@localhost tmp]# sed -i '2,4d' student.txt就可以了。

(3)向文件中追加数据

需求:在student.txt文本中第三行后面添加66666666666666。

执行命令如下:

[root@localhost tmp]# sed "3a 66666666666666" student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96.66
66666666666666
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33

同理,student.txt文本中的内容并没有被改变,如果需要改变student.txt文本中的内容,添加-i选项。

注意:sed命令的选项要写在单引号(双引号也可以)之外,如:

[root@localhost tmp]# sed -i "3a 66666666666666" student.txt

(4)向文件中插入数据

需求:在student.txt文本中第三行前面添加88888888888。

执行命令如下:

[root@localhost tmp]# sed "3i 88888888888888" student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
88888888888888
2 Sunwk 99 98 97 96.66
66666666666666
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33

同理,需要把修改写入文件,需要添加-i选项。

(5)修改文件中的多行数据(删除,追加,插入)

如果是想追加或插入多行数据,除最后一行外,每行的末尾都要加入\代表数据未完结。

需求:向student.txt文本中第二行后面追加hello world

执行如下命令:

[root@localhost tmp]# sed '2a hello \
> world' student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
hello
world
2 Sunwk 99 98 97 96.66
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33

(引号不完全是不会执行的)

提示:我发现换行后tab键提示功能不能用了。(不清楚怎么回事)

这里在说明一下-n选项,-n选项只会把经过sed命令处理的行输出到屏幕。

执行如下命令:

[root@localhost tmp]# sed -n '2a hello \
world' student.txt
hello
world

(6)替换文件中的整行文本

需求:替换student.txt文本中的第二行数据为999999999999999。

执行如下命令:

[root@localhost tmp]# sed '2c 999999999999999' student.txt
ID Name Python Linux MySQL Java
999999999999999
2 Sunwk 99 98 97 96.66
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33

注意:sed命令默认情况是不会修改文件内容的,如果确定需要让sed命令直接处理文件的内容,可以使用-i选项。不过要小心啊,这样非常容易误操作,在操作系统文件时请小心谨慎。

(7)字符串替换

sedc动作是进行整行替换的,如果仅仅想替换行中的部分数据,就要使用s动作了。

需求:修改Zhubj的Java成绩为100。

执行如下命令:

# 命令格式
[root@localhost tmp]# sed 's/旧字串/新字串/g' 文件名 # 执行命令
[root@localhost tmp]# sed 's/74.44/100/g' student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96.66
3 Zhubj 77 76 75 100
4 Shahs 66 65 64 63.33 # 或者对行范围更精准一些
[root@localhost tmp]# sed '4s/74.44/100/g' student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96.66
3 Zhubj 77 76 75 100
4 Shahs 66 65 64 63.33

注意:

4s/74.44/100/g表达式中s/之间不能有空格。

如果4s/74.44/100/g不写行号,也就是上面第一种写法,就代表替换整个文档中的匹配字符串。

(8)同时执行多条动作

sed命令中,-e选项可以同时执行多个sed动作,当然如果只是执行一个动作也可以使用-e选项,但是这时-e选项是没有什么意义的。

还要注意多个动作之间要用;号或回车分割。

练习1:

需求:把Shahs的成绩注释掉,并且把Zhubj的Python成绩改成100。

执行命令如下:

# 使用;分号的方式隔离多条动作
[root@localhost tmp]# sed -e '5s/^/#/g ; 4s/77/100/g' student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96.66
3 Zhubj 100 76 75 74.44
#4 Shahs 66 65 64 63.33

注意:

^代表行首,是正则表达式,不用加-r选项也可以。

其实上面命令中不写-e选项,命令也是可以执行的,应该是默认识别的。

但是我们尽量规范书写。

# 使用回车的方式隔离多条动作
[root@localhost tmp]# sed -e '5s/^/#/g
> 4s/77/100/g' student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96.66
3 Zhubj 100 76 75 74.44
#4 Shahs 66 65 64 63.33

注意:使用回车的方式进行动作之间的分隔,就不能在写分号;了。

特别注意:

sed命令中有多条动作执行的时候,且有多个选项的时候,-e选项要紧挨动作表达式,否则会报错。

例如:

-i -e '5s/^/#/g'正确,

-e -i '5s/^/#/g'报错。

练习2:

删除字符串使用sed命令的d操作是不能实现的,因为d操作是删除整行。这时就需要字符串替换,也就是sed命令的s动作来完成。

需求:删除Zhubj的Python成绩。

执行如下命令:

# 用空代替
[root@localhost tmp]# sed '4s/77//g' student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96.66
3 Zhubj 76 75 74.44
4 Shahs 66 65 64 63.33

3、总结

什么时候需要使用sed命令?

如果需要在脚本程序中,修改文件中的数据,这种情况下我们就需要使用sed命令。

『忘了再学』Shell基础 — 30、sed命令的使用的更多相关文章

  1. 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)

    提示:本篇文章接上一篇文章,主要说说()小括号和{}大括号的区别与使用. 8.()小括号 ():用于一串命令执行时,()中的命令会在子Shell中运行.(和下面大括号一起说明) 9.{}大括号 {}: ...

  2. 『忘了再学』Shell基础 — 1、Shell的介绍

    目录 1.Shell的由来 2.Shell的两种执行指令方式 3.什么是Shell脚本 4.Shell 是一种脚本语言 1.Shell的由来 我们比较熟悉Windows系统的图形化界面,对于图形界面来 ...

  3. 『忘了再学』Shell基础 — 4、Bash基本功能(history命令)

    目录 1.history历史命令 2.设置命令历史记录的条数 3.清空历史命令 4.历史命令的调用 5.命令与文件的补全 在Linux系统中默认的Shell就是Bourne-AgainShell(简称 ...

  4. 『忘了再学』Shell基础 — 2、Shell的作用与分类

    目录 1.Shell的作用 2.Shell的分类 1.Shell的作用 Shell除了能解释用户输入的命令,将它传递给内核,还可以: 调用其他程序,给其他程序传递数据或参数,并获取程序的处理结果. 在 ...

  5. 『忘了再学』Shell基础 — 27、AWK编程的介绍和基本使用

    目录 1.AWK介绍 (1)AWK概述 (2)printf格式化输出 (3)printf命令说明 2.AWK的基本使用 (1)AWK命令说明 (2)AWK命令使用 1.AWK介绍 (1)AWK概述 A ...

  6. 『忘了再学』Shell基础 — 3、echo命令的介绍与使用

    目录 1.echo命令的作用 2.echo命令的基本用法 3.echo命令的-e选项用法 4.echo命令一些特殊用法 (1)输出字符带有字体颜色 (2)输出字符带有背景颜色 在讲Shell脚本之前, ...

  7. 『忘了再学』Shell基础 — 24、Shell正则表达式的使用

    目录 1.正则表达式说明 2.基础正则表达式 3.练习 (1)准备工作 (2)*练习 (3).练习 (4)^和$练习 (5)[]练习 (6)[^]练习 (7)\{n\}练习 (8)\{n,\}练习 ( ...

  8. 『忘了再学』Shell基础 — 25、扩展正则表达式

    目录 1.扩展正则表达式说明 2.练习 (1)+和?练习 (2)|和()练习 3.注意(重点) 1.扩展正则表达式说明 熟悉正则表达式的童鞋应该很疑惑,在其他的语言中是没有扩展正则表达式说法的,在Sh ...

  9. 『忘了再学』Shell基础 — 9、Bash中的特殊符号(一)

    目录 1.双单引号 2.双引号 3.$符号 4.反引号 5.$()符号 6.#符号 7.\符号 1.双单引号 '':单引号.在单引号中所有的特殊符号,如$和"`"(反引号)都没有特 ...

随机推荐

  1. python 反序列化

    Python-反序列化函数使用 pickle.dump(obj, file) : 将对象序列化后保存到文件 pickle.load(file) : 读取文件, 将文件中的序列化内容反序列化为对象 pi ...

  2. 使用SQL的FOR XML PATH('')将字段用逗号隔开

    FOR XML PATH('') 将查询结果显示为XML 经常用来将查询结果按逗号分隔后显示至某一字段 select * from Area结果 添加FOR XML PATH('')后 select ...

  3. Linux系统安装后IP能通端口不通的问题处理方法

    网上大部分都是针对防火墙的问题,这里首先排除防火防火墙导致端口不通的问题! 1.排除防火墙问题(防火墙的排查方式网上一搜全是,这里不再赘述) 2.查看检查端口有没有监听,发现端口未监听(比如8080端 ...

  4. Java-GUI编程之菜单组件

    前面讲解了如果构建GUI界面,其实就是把一些GUI的组件,按照一定的布局放入到容器中展示就可以了.在实际开发中,除了主界面,还有一类比较重要的内容就是菜单相关组件,可以通过菜单相关组件很方便的使用特定 ...

  5. 1.Java基础

    1.注释 单行注释 // 多行注释 /*回车 文档注释(注解)./**回车 2.标识符 (1)Java所有组成部分都需要名字,类名,变量名以及方法名都称为标识符 (2)且标识符只能以字母.$或者_ 开 ...

  6. jquery的常用API

    1, 增 $('body').append('<h1>大标题</h1>') $('body').append('<h2>二标题</h2>') $('&l ...

  7. 广度优先搜索 BFS 学习笔记

    广度优先搜索 BFS 学习笔记 引入 广搜是图论中的基础算法之一,属于一种盲目搜寻方法. 广搜需要使用队列来实现,分以下几步: 将起点插入队尾: 取队首 \(u\),如果 $u\to v $ 有一条路 ...

  8. 如何向开源项目(Apache-InLong)提交代码

    目录 1 - 认领或提交 ISSUE 2 - clone 代码,本地编译安装 3 - 代码规范 4 - 提交代码 版权声明 Apache InLong(应龙)是一个一站式海量数据集成框架, 提供自动. ...

  9. 集合篇-ConcurrentHashMap

    点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. jdk1.7和jdk1.8中ConcurrentHashMap的区别? ...

  10. Atlassian应对CVE-2022-22963,CVE-2022-22965的常见问题

    CVE-2022-22965 常见问题解答 基本信息 已发现 Spring Framework 中的关键远程代码执行漏洞 CVE-2022-22965.根据 Spring 的安全公告,此漏洞会影响在 ...