• 三剑客sed


    内容:

    #1.sed命令介绍
    
    #2.sed脚本命令详解
      2.1 sed s替换脚本命令
      2.2 sed d删除脚本命令
      2.3 sed a和i 添加脚本命令
      2.4 sed c 替换脚本命令
      2.5 sed y 转换脚本命令
      2.6 sed p 打印脚本命令
      2.7 sed w 写入文件脚本命令
      2.8 sed r 读取文件脚本命令
      2.9 sed q 退出脚本命令
    
    #3.sed 脚本命令的寻址方式
      3.1 以数字形式指定行区间
      3.2 用文本模式指定行区间
    
    #4.sed多行命令
      4.1 N 多行操作命令
      4.2 D 多行删除命令
      4.3 P 多行打印命令
    
    #5.sed保持空间
    
    #6.sed改变指定流程
      6.1 b分支命令
      6.2 t测试命令
    
    #7.搬运学习原博客 | 及补充博客链接
    

    #1.sed命令介绍

    我们都知道,vim采用的是交互式文本编辑模式,你可以用键盘命令来交互性地插入、删除或替换数据中的文本。但sed命令则不同,它采用的是流编辑模式,最明显的特点是,在sed命令处理数据之前,需要预先提供一组规则,sed命令会按照这个规则来编辑数据。

    sed会根据脚本命令来处理文本文件中的数据,这些命令要么从命令行中输入,要么存储在一个文本文件中,此命令执行数据的顺序如下:

    1.每次仅读取一行数据。
    
    2.根据提供的规则命令匹配并修改数据。注意:【sed默认不会直接修改源文件的数据,而是会将数据复制到缓冲区中,在缓冲区中修改数据。】
    
    3.将执行结果输出。
    当一行数据匹配完成后,它会继续读取下一行数据,并重复这个过程,直到将文件中所有数据处理完毕。
    
    sed命令的基本格式如下:
    sed [选项] [脚本命令] 文件名
    

    成功使用 sed 命令的关键在于掌握各式各样的脚本命令及格式,它能帮你定制编辑文件的规则。


    #2.sed脚本命令详解

    2.1 sed s替换脚本命令

    此命令的基本格式为:[address]s/pattern/replacement/flags
    
    其中,
    address 表示指定要操作的具体行,
    pattern 指的是需要替换的内容,
    replacement 指的是要替换的新内容。
    

    关于指定具体操作行(address)的用法,这里先不做解释,文章后续会对其做详细介绍。此命令中常用的 flags 标记如下表所示:

    比如,可以指定 sed 用新文本替换第几处模式匹配的地方:

    文件:data.txt


    可以看到,使用数字 2 作为标记的结果就是,sed 编辑器只替换每行中第 2 次出现的匹配模式。



    可以看到,如果要用新文本替换所有匹配的字符串,可以使用 g 标记。



    可以看到,-n 选项会禁止 sed 输出,但 p 标记会输出修改过的行,将二者匹配使用的效果就是只输出被替换命令修改过的行。



    可以看到,w 标记会将匹配后的结果保存到指定文件中。


    [root@mytest001 202204]# sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd
    

    可以看到,在使用 s 脚本命令时,替换类似文件路径的字符串会比较麻烦,需要将路径中的正斜线进行转义。


    2.2 sed d删除脚本命令

    此命令的基本格式为:[address]d
    


    可以看到,用 d 脚本命令,它会删除指定行中的所有内容。使用该命令时要特别小心,如果你忘记指定具体行的话,文件中的所有内容都会被删除。



    可以看到,通过行号指定,比如删除 data2.txt 文件内容中的第 3 行。



    可以看到,通过特定行区间指定,比如删除 data2.txt 文件内容中的第 2、3行。



    可以看到,也可以使用两个文本模式来删除某个区间内的行,但这么做时要小心,你指定的第一个模式会“打开”行删除功能,第二个模式会“关闭”行删除功能,因此,sed 会删除两个指定行之间的所有行(包括指定的行)。



    可以看到,通过特殊的文件结尾字符,比如删除 data2.txt 文件内容中第 3 行开始的所有的内容。

    在此强调,在默认情况下 sed 并不会修改原始文件,这里被删除的行只是从 sed 的输出中消失了,原始文件没做任何改变。


    2.3 sed a和i 添加脚本命令

    a 命令表示在指定行的后面附加一行,i 命令表示在指定行的前面插入一行,这里之所以要同时介绍这 2 个脚本命令,因为它们的基本格式完全相同,如下所示:
    [address]a(或 i)\新文本内容
    


    可以看到,将一个新行插入到数据流第三行前。



    可以看到,将一个新行附加到数据流中第三行后。



    可以看到,将一个多行数据添加到数据流中,只需对要插入或附加的文本中的每一行末尾(除最后一行)添加反斜线即可。


    2.4 sed c 替换脚本命令

    c 命令表示将指定行中的所有内容,替换成该选项后面的字符串。该命令的基本格式为:
    [address]c\用于替换的新文本
    

    可以看到,修改第三行中的文本。


    2.5 sed y 转换脚本命令

    y 转换命令是唯一可以处理单个字符的 sed 脚本命令,其基本格式如下:
    [address]y/inchars/outchars/
    

    转换命令会对 inchars 和 outchars 值进行一对一的映射,即 inchars 中的第一个字符会被转换为 outchars 中的第一个字符,第二个字符会被转换成 outchars 中的第二个字符...这个映射过程会一直持续到处理完指定字符。如果 inchars 和 outchars 的长度不同,则 sed 会产生一条错误消息。



    可以看到,inchars 模式中指定字符的每个实例都会被替换成 outchars 模式中相同位置的那个字符。 转换命令是一个全局命令,也就是说,它会将文本行中找到的所有指定字符自动进行转换,而不会考虑它们出现的位置。



    可以看到,sed 转换了在文本行中匹配到的字符 '1' 的两个实例,我们无法限定只转换在特定地方出现的字符。


    2.6 sed p 打印脚本命令

    p 命令表示搜索匹配文本模式的行,并输出该行的内容,此命令的基本格式为:
    [address]p
    


    可以看到,用 -n 选项和 p 命令配合使用,我们可以禁止输出其他行,只打印包含匹配文本模式的行。



    可以看到,sed 命令会查找包含数字 3 的行,然后执行后面命令。首先,脚本用 p 命令来打印出原始行;然后它用 s 命令替换文本,并用 p 标记打印出替换结果。输出同时显示了原来的行文本和新的行文本。


    2.7 sed w 写入文件脚本命令

    w 命令用来将文本中指定行的内容写入文件中,此命令的基本格式如下:
    [address]w filename
    


    可以看到,将数据流中的前两行打印到一个文本文件中。



    可以看到,不想让行直接输出,可以用 -n 选项。

    通过使用 w 脚本命令,sed 可以实现将包含文本模式的数据行写入目标文件。


    2.8 sed r 读取文件脚本命令

    r 命令用于将一个独立文件的数据插入到当前数据流的指定位置,该命令的基本格式为:
    [address]r filename
    


    可以看到,将 data6.txt 文件中的内容插入到 address 指定行的后面。



    可以看到,将指定文件中的数据插入到数据流的末尾,可以使用 $ 地址符。


    2.9 sed q 退出脚本命令

    q 命令的作用是使 sed 命令在第一次匹配任务结束后,退出 sed 程序,不再进行对后续数据的处理。
    


    可以看到,sed 命令在打印输出第 2 行之后,就停止了,是 q 命令造成的。



    可以看到,使用 q 命令之后,sed 命令会在匹配到 number 1 时,将其替换成 number 0,然后直接退出。


    #3.sed 脚本命令的寻址方式

    前面在介绍各个脚本命令时,我们一直忽略了对 address 部分的介绍。对各个脚本命令来说,address 用来表明该脚本命令作用到文本中的具体行。默认情况下,sed 命令会作用于文本数据的所有行。如果只想将命令作用于特定行或某些行,则必须写明 address 部分,表示的方法有以下 2 种:

    1、以数字形式指定行区间;
    2、用文本模式指定具体行区间。
    
    以上两种形式都可以使用如下这 2 种格式,分别是:
    
    [address]脚本命令
    
    或者
    
    address {
      多个脚本命令
    }
    

    以上两种形式在前面例子中都有具体实例,因此这里不再做过多赘述。


    3.1 以数字形式指定行区间

    当使用数字方式的行寻址时,可以用行在文本流中的行位置来引用。
    sed 会将文本流中的第一行编号为 1,然后继续按顺序为接下来的行分配行号。在脚本命令中,指定的地址可以是单个行号,或是用起始行号、逗号以及结尾行号指定的一定区间范围内的行。



    可以看到,sed 只修改地址指定的第二行的文本。



    可以看到,将命令作用到文本中从某行开始的所有行,可以用特殊地址——美元符($)。


    3.2 用文本模式指定行区间

    sed 允许指定文本模式来过滤出命令要作用的行,格式如下:
    /pattern/command
    

    注意,必须用正斜线将要指定的 pattern 封起来,sed 会将该命令作用到包含指定文本模式的行上。



    可以看到,只修改用户 test 的默认 shell,可以使用 sed 命令。


    虽然使用固定文本模式能帮你过滤出特定的值,就跟上面这个用户名的例子一样,但其作用难免有限,因此,sed 允许在文本模式使用正则表达式指明作用的具体行。正则表达式允许创建高级文本模式匹配表达式来匹配各种数据。这些表达式结合了一系列通配符、特殊字符以及固定文本字符来生成能够匹配几乎任何形式文本的简练模式。

    可以看到,在上述命令中,"h[0-9]" 来匹配 h1、h2、h3,匹配到之后,把h前面的空白替换成<>,
    然后&表示将正则表达式匹配的内容(h1、h2、h3)替换到此处,最终的形式为<h1>、<h2>、<h3>,第二个替换命令原理也是这样。
    

    #4.sed多行命令

    在学习 sed 命令的基础功能时,你可能注意到了一个局限,即所有的 sed 命令都只是针对单行数据执行操作,在 sed 命令读取缓冲区中的文本数据时,它会基于换行符的位置,将数据分成行,sed 会根据定义好的脚本命令一次处理一行数据。 但是,有时我们需要对跨多行的数据执行特定操作。比如说,在文本中查找一串字符串"http://c.biancheng.net",它很有可能出现在两行中,每行各包含其中一部分。这时,如果用普通的 sed 编辑器命令来处理文本,就不可能发现这种被分开的情况。 幸运的是,sed 命令的设计人员已经考虑到了这种情况,并设计了对应的解决方案。sed 包含了三个可用来处理多行文本的特殊命令,分别是:

    1、Next 命令(N):将数据流中的下一行加进来创建一个多行组来处理。
    
    2、Delete(D):删除多行组中的一行。
    
    3、Print(P):打印多行组中的一行。
    
    注意,以上命令的缩写,都为大写。
    

    4.1 N 多行操作命令

    N 命令会将下一行文本内容添加到缓冲区已有数据之后(之间用换行符分隔),从而使前后两个文本行同时位于缓冲区中,sed 命令会将这两行数据当成一行来处理。


    可以看到,sed 命令查找含有单词 first 的那行文本,找到之后,会用N命令将下一行也放入缓冲区中(之间用换行符分隔),把两行当成一行来处理,然后用替换命令s将换行符替换成空格。结果就是,文本文件中的两行在sed的输出中成了1行。

    to be continued...

  • 相关阅读:
    5.抽象工厂模式-abstractfactory
    java-code优化(持续更新)
    4.工厂方法模式-factoryMethod
    3.单例模式-singleton
    2.适配器模式-adapter
    1.外观模式-facade
    Hibernate(七)多对一单向关联映射
    Hibernate(六)一对一双向关联映射
    Hibernate(五)一对一单向关联映射
    Hibernate(四)基本映射
  • 原文地址:https://www.cnblogs.com/yachengmuCC/p/16210577.html
Copyright © 2020-2023  润新知