美文网首页
sed命令的使用

sed命令的使用

作者: 传棋Jaking | 来源:发表于2018-02-01 12:08 被阅读0次

    sed命令

    sed 是一种几乎包括在所有 UNIX 平台(包括 Linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令,和vim很像,但用起来却不一样。

    sed基本格式

    [root@localhost ~]# sed [选项] ‘[动作]’ 文件名

    选项:
    -n: 一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕。
    -e: 允许对输入数据应用多条sed命令编辑。
    -i: 用sed的修改结果直接修改读取数据的文件, 而不是由屏幕输出。
    
    动作:
    a \: 追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。
    c \: 行替换,用c后面的字符串替换原数据行。替换多行时,除最后一行外,每行末尾需用“\”代表数据未完结。
    i \: 插入,在当期行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。
    d: 删除,删除指定的行。
    p: 打印,输出指定的行。
    s: 字串替换,用一个字符串替换另外一个字符串。格式为“行范 围s/旧字串/新字串/g”(和vim中的替换格式类似)。
    

    只看文字解释还有点不知所云,那么接下来我用一些例子来说明sed的基本用法。

    sed基本用法

    下面的具体操作将围绕这张学生成绩表展开

    [root@localhost ~]# vim student.txt
    ID    Name      PHP   Linux   MySQL   Average
    1     Jaking    82     95     86       87.66
    2     Geling    74     96     87       85.66
    3     igi       99     83     93       91.66
    

    在学习sed基本用方法前,我需要指出sed是对行数据进行操作的。

    1.查看行内容

    [root@localhost ~]# sed '2p' student.txt
    查看文件的第二行

    ID    Name      PHP   Linux   MySQL   Average
    1     Jaking    82     95     86       87.66
    1     Jaking    82     95     86       87.66
    2     Geling    74     96     87       85.66
    3     igi       99     83     93       91.66
    

    这样的结果意不意外,惊不惊喜?
    其实,sed查看了第二行过后,还会再查看文件的全部内容,然后输出到屏幕上。
    要想只查看第二行的内容要怎么办呢?请看下面的例子:

    [root@localhost ~]# sed -n '2p' student.txt

    1     Jaking    82       95     86       87.66
    
    

    加了-n过后,sed只会把经过sed命令处理的行输出到屏幕,这样就可以实现想要实现的结果了。

    2.删除行数据

    [root@localhost ~]# sed '2,4d' student.txt #删除第二行到第四行的数据,但不修改文件本身。

    ID    Name      PHP   Linux   MySQL   Average
    
    

    3.插入数据

    [root@localhost ~]# sed '2a Hello' student.txt #在第二行后追加hello

    ID    Name      PHP   Linux   MySQL   Average
    1     Jaking    82     95     86       87.66
    Hello
    2     Geling    74     96     87       85.66
    3     igi       99     83     93       91.66
    
    

    [root@localhost ~]# sed '2i Hello \ nWorld' student.txt #在第二行前插入两行数据

    ID    Name      PHP   Linux   MySQL   Average
    1     Jaking    82     95     86       87.66
    Hello
    World
    2     Geling    74     96     87       85.66
    3     igi       99     83     93       91.66
    

    对这样的结果有疑问?n去哪了?
    \n是表示回车换行的意思。

    说到这里补充一点,当插入动作未完结时可以在后面加\,追加和替换的未完结动作也一样,在后面加\ 。
    [root@localhost ~]# sed '2i Hello World\
    > Hello Jaking' student
    ID    Name      PHP   Linux   MySQL   Average
    1     Jaking    82     95     86       87.66
    Hello World
    Hello Jaking
    2     Geling    74     96     87       85.66
    3     igi       99     83     93       91.66
    
    

    4.数据替换

    [root@localhost ~]# sed '4c No such person‘ student.txt

    ID    Name      PHP   Linux   MySQL   Average
    1     Jaking    82     95     86       87.66
    2     Geling    74     96     87       85.66
    No such person
    

    What? igi去哪了?
    因为我觉得igi成绩太好了,我嫉妒他,不想看到他的成绩,所以我整了一个查无此人。
    但我觉得这样整嫌疑有点大,会让人怀疑的。接下来我要怎么做呢?

    5.字符串替换

    [root@localhost ~]# sed '4s/99/59/g' student.txt

    ID    Name      PHP   Linux   MySQL   Average
    1     Jaking    82     95     86       87.66
    2     Geling    74     96     87       85.66
    3     igi       59     83     93       91.66
    

    哈~ igi最高一门课程的分数被我改成59分了。。
    但仔细想想这操作好像哪里不对~~
    igi平均分居然还是91.66,这就不科学了,应该是78.33才对!
    于是我再想办法...

    [root@localhost ~]# sed -e '4s/99/59/g;4s/91.66/78.33/g' student.txt

    ID    Name      PHP   Linux   MySQL   Average
    1     Jaking    82     95     86       87.66
    2     Geling    74     96     87       85.66
    3     igi       59     83     93       78.33
    

    加上-e,可以同时替换多个数据,这一波操作过后就完美了。

    不过,还没完呢!有人跟我说Geling的PHP课程缺考,他居然还有74分!这不科学呀!

    没事,让我来:

    [root@localhost ~]# sed '3s/74//g' student.txt

    ID    Name      PHP   Linux   MySQL   Average
    1     Jaking    82     95     86       87.66
    2     Geling           96     87       85.66
    3     igi       59     83     93       78.33
    

    在//中不写替换内容即可实现“擦除”操作。
    但我感觉这样还不完美,更完美的做法是:
    root@localhost ~]# sed -e '3s/74/缺考/g';3s/85.66/91.5/g' student.txt

    ID    Name      PHP   Linux   MySQL   Average
    1     Jaking    82     95     86       87.66
    2     Geling    缺考   96     87       85.66
    3     igi       59     83     93       78.33
    

    最后,还有很重要的一点。我以上的所有操作都不会对原文件做更改,要想更改原文件还需要加上-i选项。

    刚刚我执行了那么多操作,现在来看一下原文件内容:

    [root@localhost ~]# cat student.txt
    ID    Name      PHP   Linux   MySQL   Average
    1     Jaking    82     95     86       87.66
    2     Geling    74     96     87       85.66
    3     igi       99     83     93       91.66
    

    原文件内容没有任何改变!
    Geling的PHP课程缺考是事实,现在怎么还是得74分,我需要改原文件。
    root@localhost ~]# sed -i -e '3s/74/缺考/g';3s/85.66/91.5/g' student.txt

    ID    Name      PHP   Linux   MySQL   Average
    1     Jaking    82     95     86       87.66
    2     Geling    缺考   96     87       85.66
    3     igi       59     83     93       78.33
    

    root@localhost ~]# cat student.txt

    ID    Name      PHP   Linux   MySQL   Average
    1     Jaking    82     95     86       87.66
    2     Geling    缺考   96     87       85.66
    3     igi       59     83     93       78.33
    

    加上-i选项,sed所执行的操作才会更改原文件,否则只是更改输出结果并打印到屏幕上。

    Jaking

    2018-02-01
    广州

    相关文章

      网友评论

          本文标题:sed命令的使用

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