|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

 

 

posted on   yanqi_vip  阅读(11)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示