美文网首页shellLinuxLinux 学习
【现学现忘&Shell编程】— 36.sed命令(二)

【现学现忘&Shell编程】— 36.sed命令(二)

作者: 繁华似锦Fighting | 来源:发表于2020-10-24 00:15 被阅读0次

    (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编程】— 36.sed命令(二)

        本文链接:https://www.haomeiwen.com/subject/ahgdmktx.html