zoukankan      html  css  js  c++  java
  • Linux三大文本处理工具之sed命令

    1.sed简介

    Sed是一款流编辑工具,用来对文本进行过滤与替换操作,Sed通过一次仅读取一行内容来对某些指令进行处理后输出,所以Sed更适合于处理大数据文件。首先,Sed通过文件或管道读取文件内容,但Sed默认并不直接修改源文件,而是将读入的内容复制到缓冲区中,我们称之为模式空间(pattern space),所有的指令操作都是在模式空间中进行的,然后Sed根据相应的指令对模式空间中的内容进行处理并输出结果,默认输出至标准输出(即屏幕上)。
    工作流程如图:
    image

    2.语法格式

    Sed从文件中读取数据,如果没有输入文件,则默认对标准输入进程数据进行处理。
    sed [选项]...{脚本指令} [输入文件]

    命令参数:

    • -n:使用安静(silent)模式。所有来自STDIN的数据一般都会被列出到终端上。但如果加上-n参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来(只打印模式空间中的内容);
    • -e: 允许多个脚本指令被执行
    • -f:直接将sed的动作写在一个文件内,-f filename则可以运行filename内的sed动作;
    • -r:sed 的动作支持的是延伸型正规表示法的语法;
    • -i:in place editing 直接修改读取的文件内容,而不是输出到终端;

    3.脚本指令

    脚本指令需要指定一个地址来决定操作范围,如果不指定,则默认对文件的所有行进行操作。
    基本格式 :
    [地址]命令

    • a :append 新增, a的后面可以接字串, 新增到当前行的下一行。
    • i : insert 插入, i 的后面可以接字串,插入到当前行的上一行;
    • d :delete 删除,因为是删除,所以 d 后面通常不接任何咚咚;
    • p :print 打印,亦即将某个选择的数据打印出来。通常 p 会与参数 sed -n 一起运行。
    • s :substitute 替代,通常这个 s 的动作可以搭配正规表示法,例如 s/old/new/g ,后面的参数g: global 代表替换作用于全局的每一行。如果没有g,则至替换每行出现的第一个匹配字符。

    更多的指令大全如图:

    地址的匹配语法

    4.常用操作小结

    (1)插入

    • 在第n行后插入TYPE=Ethernet
      sed '2a TYPE=Ethernet' test.txt
    • 在第二行前插入TYPE=Ethernet
      sed '2i TYPE=Ethernet' test.txt
    • 匹配到包含ONBOOT的行,并在其后添加TYPE=Ethernet
      sed '/ONBOOT/a TYPE=Ethernet' test.txt

    (2)删除

    删除指令需要注意以下几点:
    (1)删除只能删除整行,如果删除部分需要用替换。
    (2)删除指令用于删除匹配的行,而且删除命令还会改变sed脚本中命令的执行顺序。因为匹配的行一旦删除,模式空间将变为“空”,自然不会再执行sed脚本后续的命令。删除命令将导致读取新的输入行(下一行),而sed脚本中的命令则从头开始重新执行。

    • 删除第二行
      sed '2d ' test.txt
    • 删除2-8行
      sed '2,8d' test.txt
    • 删除空行
      /^$/d

    (3)打印

    • 打印文件的第3行
      sed -n '3p' test.txt
    • 打印奇数行
      sed -n '1~2p' test.txt

    (4)替换

    指令格式:[address]s/pattern/replacement/flags

    address为操作地址,s为替换指令,/pattern/匹配需要替换的内容,/replacement为替换的新内容。
    Flags标记可以是:

    replacement为字符串,用来替换与正则表达式匹配的内容。在replace部分,只有下列字符有特殊含义:

    示例 :

    (5)更改

    注意更改是会把整行更改,替换只会替换匹配的内容。

    • 将包含ONBOOT行的内容更改为ONBOOT=no
      sed '/ONBOOT/c ONBOOT=no' test.txt

    (6)执行多个指令

    如果想要一次执行多个指令,主要有以下两种方法:
    (1)使用分号隔开使用

    • sed 's/a/b/g;s/c/d/g' text.txt

    (2)使用-e 选项

    • sed -e 's/yes/no/' -e 's/static/dhcp/' test.txt

    5. 一些比较复杂的示例

    1. 把将样本文件中第二个替换为

    样本文件:

    [root@andrew Andrew]# cat test.txt 
    <html>
    <title>First Web</title>
    <body>Hello the World!<body>
    </html>
    

    指令文件:

    [root@andrew Andrew]# cat sed.sh 
    /body/{
    s///body/2
    }
    

    先匹配/body/ ,然后替换成//body/,最后2 表示的是匹配该行的第二个字符串.后面的指令可以用花括号括起来。
    执行结果:

    [root@andrew Andrew]# sed -f sed.sh test.txt 
    <html>
    <title>First Web</title>
    <body>Hello the World!</body>
    </html>
    

    2.给每行前一个的h1,h2等添加<>,后一个h1,h2添加</>

    样本文件:

    [root@andrew Andrew]# cat test.txt 
    <html>
    <title>First Web</title>
    <body>
    h1Helloh1
    h2Helloh2
    h3Helloh3
    </body>
    </html>
    

    指令文件:

    [root@andrew Andrew]# cat sed.sh 
    /h[0-9]/{
    s//<&>/1
    s//</&>/2
    }
    

    先匹配/h[0-9/ ,然后替换成/<&>/1,//<&>/2,其中& 表示前面匹配的字符串,常用于在原有字符串上增加字符。
    执行结果:

    [root@andrew Andrew]# sed -f sed.sh test.txt 
    <html>
    <title>First Web</title>
    <body>
    <h1>Hello</h1>
    <h2>Hello</h2>
    <h3>Hello</h3>
    </body>
    </html>
    

    参考链接:https://blog.csdn.net/qq_37931597/article/details/86505723

  • 相关阅读:
    Identifier expected after this token
    需要整理的
    Context
    SharedPreferences
    一些常规注意事项
    一个点亮屏幕的service
    BroadcastReceiver中调用Service
    BroadcastReceiver
    Service
    微服务简介
  • 原文地址:https://www.cnblogs.com/laiyaling/p/12786401.html
Copyright © 2011-2022 走看看