• Linux Shell编程 sed命令


    概述

    sed 是一种几乎可以应用在所有 UNIX 平台(包括 Linux)上的轻量级流编辑器,体积小。所以,它可以对从如管道这样的标准输入中接收的数据进行编辑。 

    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 所做的修改并不会直接改变文件的内容(如果是用管道符接收的命令的输出,则连文件都没有),而是把修改结果只显示到屏幕上,除非使用"-i"选项才会直接修改文件。

    sed命令示例

    sed行数据操作示例

    利用"p"动作查看student.txt 文件的第二行 。

    [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 Gao 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 Gao 99 83 93 91.66

    sed命令中所有的动作必须使用"单引号"包含;在动作中可以使用数字代表行号,逗号代表连续的行范围。使用"$"代表最后一行,如果动作是"2,$d",则代表从第二行删除到最后一行。

    在第二行后加入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 Gao 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 Gao 99 83 93 91.66

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

    使用"-n"选项只查看sed命令操作的数据

    [root@localhost ~]# sed -n'2i hello 
    world' student.txt
    hello
    world

    实现行数据替换 

    [root@localhost ~]# cat student.txt | sed '2c No such person'
    ID Name PHP Linux MySQL Average
    No such person
    2 Sc 74 96 87 85.66
    3 Gao 99 83 93 91.66

    sed 命令在默认情况是不会修改文件内容的。如果我确定需要让 sed 命令直接处理文件的内容,则可以使用"-i"选项。可以使用这样的命令:

    [root@localhost ~]# sed -i'2c No such person' student.txt

    sed命令的字符串替换示例

    "c"动作是进行整行替换的,如果仅仅想替换行中的部分数据,就要使用"s"动作了。"s"动作的格式如下:

    [root@localhost ~]# sed's/旧字符串/新字符串/g' 文件名

    在第三行中,把74换成99

    [root@localhost ~]# sed '3s/74/99/g' student.txt
    ID Name PHP Linux MySQL Average
    1 Liming 82 95 86 87.66
    2 Sc 99 96 87 85.66
    3 Gao 99 83 93 91.66

    如果想把某行的成绩注释掉,让它不再生效,则可以这样做:

    [root@localhost ~]#sed '4s/^/#/g' student.txt
    ID Name PHP Linux MySQL Average
    1 Liming 82 95 86 87.66
    2 Sc 74 96 87 85.66
    #3 Gao 99 83 93 91.66

    在这里使用正则表达式,"^"代表行首
    不仅如此,我们还可以同时把"Liming"和"Gao"替换为空 

    [root@localhost ~]# sed -e 's/Liming//g; s/Gao//g' student.txt
    ID Name PHP Linux MySQL Average
    1 82 95 86 87.66
    2 Sc 74 96 87 85.66
    3 99 83 93 91.66

    "-e"选项可以同时执行多个 sed 动作,多个动作之间要用";"或回车分隔,例如,上一条命令也可以这样写:

    [root@localhost ~]# sed -e 's/Liming//g
    > s/Gao//g' student.txt
    ID Name PHP Linux MySQL Average
    1 82 95 86 87.66
    2 Sc 74 96 87 85.66
    3 99 83 93 91.66
  • 相关阅读:
    ***mysql索引总结----mysql索引类型以及创建
    XCODE快捷键个人总结
    ios下划线变量:为什么变量前要加下划线才有用?
    ios开发之AppDelegate
    **IOS:xib文件解析(xib和storyboard的比较,一个轻量级一个重量级)
    NEON简介【转】
    NEON在Android中的使用举例【转】
    时钟频率的理解--笔记【原创】
    理解逐次逼近寄存器型ADC:与其它类型ADC的架构对比【转】
    模数转换器(ADC)的基本原理【转】
  • 原文地址:https://www.cnblogs.com/lizhouwei/p/10029510.html
Copyright © 2020-2023  润新知