『忘了再学』Shell基础—30、sed命令的使用

博客 分享
0 205
张三
张三 2022-06-13 12:00:30
悬赏:0 积分 收藏

『忘了再学』Shell基础 — 30、sed命令的使用

目录
  • 1、sed命令说明
  • 2、行数据操作
    • (1)查看文件中的数据
    • (2)删除文件中的数据
    • (3)向文件中追加数据
    • (4)向文件中插入数据
    • (5)修改文件中的多行数据(删除,追加,插入)
    • (6)替换文件中的整行文本
    • (7)字符串替换
    • (8)同时执行多条动作
  • 3、总结

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   Java1       Tangs   88      87      86      85.552       Sunwk   99      98      97      96,663       Zhubj   77      76      75      74.444       Shahs   66      65      64      63.33

(1)查看文件中的数据

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

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

[root@localhost tmp]# sed '2p' student.txtID  Name    Python  Linux   MySQL   Java1   Tangs   88      87      86      85.551   Tangs   88      87      86      85.552   Sunwk   99      98      97      96.663   Zhubj   77      76      75      74.444   Shahs   66      65      64      63.33

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

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

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

(2)删除文件中的数据

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

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

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

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

[root@localhost tmp]# cat student.txt ID  Name    Python  Linux   MySQL   Java1   Tangs   88      87      86      85.552   Sunwk   99      98      97      96.663   Zhubj   77      76      75      74.444   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   Java1   Tangs   88      87      86      85.552   Sunwk   99      98      97      96.66666666666666663   Zhubj   77      76      75      74.444   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.txtID  Name    Python  Linux   MySQL   Java1   Tangs   88      87      86      85.55888888888888882   Sunwk   99      98      97      96.66666666666666663   Zhubj   77      76      75      74.444   Shahs   66      65      64      63.33

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

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

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

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

执行如下命令:

[root@localhost tmp]# sed '2a hello \> world' student.txtID  Name    Python  Linux   MySQL   Java1   Tangs   88      87      86      85.55helloworld2   Sunwk   99      98      97      96.663   Zhubj   77      76      75      74.444   Shahs   66      65      64      63.33

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

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

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

执行如下命令:

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

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

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

执行如下命令:

[root@localhost tmp]# sed '2c 999999999999999' student.txtID  Name    Python  Linux   MySQL   Java9999999999999992   Sunwk   99      98      97      96.663   Zhubj   77      76      75      74.444   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.txtID  Name    Python  Linux   MySQL   Java1   Tangs   88      87      86      85.552   Sunwk   99      98      97      96.663   Zhubj   77      76      75      1004   Shahs   66      65      64      63.33# 或者对行范围更精准一些[root@localhost tmp]# sed '4s/74.44/100/g' student.txtID  Name    Python  Linux   MySQL   Java1   Tangs   88      87      86      85.552   Sunwk   99      98      97      96.663   Zhubj   77      76      75      1004   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.txtID  Name    Python  Linux   MySQL   Java1   Tangs   88      87      86      85.552   Sunwk   99      98      97      96.663   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.txtID  Name    Python  Linux   MySQL   Java1   Tangs   88      87      86      85.552   Sunwk   99      98      97      96.663   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   Java1   Tangs   88      87      86      85.552   Sunwk   99      98      97      96.663   Zhubj           76      75      74.444   Shahs   66      65      64      63.33

3、总结

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

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

posted @ 2022-06-13 11:10 繁华似锦Fighting 阅读(33) 评论(0) 编辑 收藏 举报
回帖
    张三

    张三 (王者 段位)

    821 积分 (2)粉丝 (41)源码

     

    温馨提示

    亦奇源码

    最新会员