美文网首页述术
Linux之Sed工具的使用详解

Linux之Sed工具的使用详解

作者: 魏镇坪 | 来源:发表于2016-03-07 13:24 被阅读1956次

    Sed工具工作原理及特性

    • 1. sed是流编辑器,每一次读取一行到内存中,即称之为模式空间(pattern space)
    • 2. 默认不修改原文件,如果需要修改需加-i参数
    • 3. sed有模式空间及保持空间(hold sapce),默认打印模式空间中的内容到标准输出
    • 4. 默认情况下,模式空间中的内容打印一次,被模式匹配到的内容被命令动作处理过,一般情况下会再次打印 到标准输出,除非使用d选项。
    • 5. sed读取每行的时候会将内容保存至内存中
    • 6. 支持正则和扩展正则表达式,除-y选项

    Sed命令

    sed - ed - stream editor for filtering and transforming text
    • synopsis: sed [OPTION]... {script} [input-file]…
      • 常用格式: sed 选项 地址定界 编辑命令 文件

      • [Options]
        • -n : 不输出模式空间中的内容至屏幕,即关闭不能被模式匹配到的行到标准输出中
        • -e : 多项编辑一次执行
        • -f FILE : FILE中每行是一个操作命令
        • -r : 支持扩展正则表达式
        • -i : 直接保存至原文件中
      • 地址定界常规方法
        • 1 空地址:即对全文进行处理
          • sed 's/root/ROOT/' /etc/passwd
        • 2 单地址:
          • # : 指定行
            • sed -n '1,5{/^#/p}' fstab
            • sed '1,+5{/^#/d}' fstab
          • /pattern/ : 被模式匹配到的每一行
            • sed '/^root/p' /etc/passwd
        • 3 地址范围
          • #,# : 从#号行到#号行
            • sed '2,3d' /etc/fstab : 显示除2到3行的所有行
          • #,+# : 从#号行向下#行
            • sed '2,+5d' /etc/fstab : 删除2到5行
          • #,/pattern/ : 从#号行到被模式匹配到的行
            • sed '1,/^UUID/d' fstab1 : 删除从第1行到被模式匹配到的第一个行的位置,删除
          • /pattern1/,/pattern2/ : 从模式1匹配到的行到被模式2匹配到的行
            • sed -n '/^[/]/p' fstab1 : 显示为/开始的行
            • sed '/^#/d' fstab1 : 显示开始为#号的行
          • $ : 表示最后一行
            • sed '$d' fstab1 : 删除最后一行
        • 4 步进地址表示法:
          • 1~2: 所有奇数行
            • sed -n '1~2p' fstab1
          • 2~2: 所有偶数行
            • sed -n '2~2p' fatab1
      • sed编辑命令
        • d : 删除模式空间中的内容
          • 示例:
            • sed '1,5d' FILE : 删除1到5行的内容
            • sed '1~2d' FILE : 删除奇数行,只显示偶数行
        • p : 显示被模式框定的内容
          • 示例:
            • sed '1~2p' FILE : 显示奇数行,如果只需要显示一次,需要使用-n关闭默认模式空间的内容
            • sed -n '/./p' a.sh : 显示非空行,但对制表符无效
        • P : 只显示模式空间中的第一行
          • 示例:
            • seq 5 | sed -n 'N;P' : 显示结果为1、3两行
        • a \line : 追加line行至匹配到行的后面,如果是多行可使用\n实现多行追加
          • 示例:
            • sed '/^UUID/ a\line1\nline2' fstab :查找匹配到UUID开始的行,并在后面添加line1,line2两行内容
        • i \line : 添加line行到匹配行的前面,如果是多行可使用\n实现多行添加
          • 示例:
            • sed '/^UUID/i \line1\nline2' fstab :查找匹配到UUID开始的行,并在其前面增加line1,line2两行内容
        • c \line : 把匹配到的行替换为line行
          • 示例
            • sed '/^UUID/c \newline' fstab1 : 匹配以UUID开始的行,并把其替换为newline行
        • w /PATH : 将模式空间匹配到的行,写入指定文件中
          • 示例
            • sed '/#/!w ./w.txt' fstab : 匹配非#开始的行,并写入当前目录下的w.txt文件中
        • r /PATH : 将PATH中指定的文件写入匹配到的行下方,多用于文件合并。
          • 示例:
            • sed '/^UUID/r ./w.txt' fstab :把当前目录下的w.txt文件写入到以UUID开头的行下
        • q : 退出sed,一般用于打印到第几行即退出
          • 示例:
            • sed '10q' FILE : 只打印文件中的前10行,等同于sed -n '1,10p' FILE
        • y : 完成大小写替换(等同于s///,基本不用)
          • sed '1,15y/UUID/uuid/' fstab1 :替换1到15行的内容UUID为uuid
          • sed 'y/UUID/uuid/' fstab1 : 替换全文每行中的第一个匹配到的
        • = : 匹配到的行,显示一个行号,默认在其匹配到的行上方显示对应的行号,如果需要只显示行号,需要加-n参数,把模式空间中的内容关闭显示。
          • 示例
            • sed '/^UUID/=' fstab : 在匹配到UUID开头的行上一行打印其行号
            • sed -n '$=' fstab : 显示最后一行的行号,一般可用于显示文本的总行数。
            • sed '/./=' File : 显示所有行的行号,但空行不显示行号
        • ! : 条件取反,一般用于模式之后,命令之前
          • 示例
            • sed '/^#/!d' FILE : 只显示非注释的行
        • s/// : 字符替换查找,其分隔符可自动指定,常用的有,s@@@、s###。
          • 替换标记操作符
            • g : 全局替换,不加g只能每行开始的第一个匹配操作
              • 如果只想从第几次开始替换,可使用3gNg(N代表一个数值)
            • w /PATH: 将替换成功的结果保存至指定文件中
            • p : 显示替换成功的行
              • 示例
                • sed 's/UUID/uuid/' fstab : 将UUID替换为uuid
                • sed 's/love/& you' FILE: 将love替换为love you,&`表示对前面模式的引用
                • sed 's/^\(UUID\).*/\1 Hello/' fstab1 : 将UUID开头的行替换为UUID Hello的内容
                • sed -n '1,15s/^UUID/uuid/gp' fstab : 查找1到15行以UUID开始的行,并将其替换为uuid,并且只显示被替换过的行
                • sed 's/.$//' File 将每行中最后一个字符删除,.$代表每行的最后一个字符
        • h : 把模式空间中的内容覆盖至保持空间中
        • H : 把模式空间中的内容追加至保持空间中
        • g : 把保持空间中的内容覆盖至模式空间中
        • G : 把保持空间中的内容追加至模式空间中
        • x : 把模式空间中的内容到保持空间中的内容互换,初始保持空间中为空
        • n : 读取下一行覆盖模式空间中的行
          • seq 11 | sed 'n;d' : 显示结果为1、3、5、7、9、11 ,默认动作先输出模式空间中的行,再覆盖读取下一行,再执行d命令
          • seq 10 | sed 'n;d' : 显示结果为1、3、5、7、9
        • N : 读取下一行并追加到模式空间中的行后面,使用\n分隔
          • seq 11 | sed 'N;d' : 显示结果为11,默认动作先读取两行,然后执行d操作
          • seq 10 | sed 'N;d' :显示结果为空
        • D : 删除模式空间中的多行
          • seq 11 | sed 'N;D' : 显示结果为11
        • {} : 多命令同时执行时,需要使用{}括起来
          • sed -n '/^UUID/{N;p}' fstab1 : 读取UUID开始的行,再读取下一行并打印模式空间的内容。

    应用实例

    1. 替换文本中的字符串
      • echo "sksksksksksk" | sed 's/sk/SK/3g
        • 结果:skSKSKSKSKSK
    2. 定界符出现在样式内部时,需要进行转义,建议更换定界符
      • sed 's/\/bin/\/usr\/local\/bin/g'
    3. 删除指定的行
      • sed '2d' file : 删除第二行
      • # sed '2,$d' file : 删除第二行到最后一行
      • sed '$d' file : 删除最后一行
      • sed '/^test/'d file : 删除文件中以test开头的行
    4. 正则表达式 \w+ 匹配每一个单词,使用 [&] 替换它,& 对应于之前所匹配到的单词
      • echo this is a test line | sed 's/\w\+/[&]/g'
        • 结果:[this] [is] [a] [test] [line]
    5. 所有以192.168.0.1开头的行都会被替换成它自已加localhost
      • sed 's/^192.168.0.1/&localhost/' file
        • 结果:192.168.0.1localhost
    6. 替换digit 7的内容替换为 7

      • echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'
        • this is 7 in a number
    7. love被标记为1,所有loveable会被替换成lovers,并打印出来

      • sed -n 's/\(love\)able/\1rs/p' file
    8. 所有在模板test和check所确定的范围内的行都被打印

      • sed -n '/test/,/check/p' file
    9. 对于模板test和west之间的行,每行加上字符串aaa bbb

      • sed '/test/,/west/s/$/aaa bbb/' file
    10. 查找line1 到line2之间的所有aa bbb 替换为AA BBB

      • sed '/line1/,/line2/s/aa bbb/AA BBB/' test.sh
    11. 使用n;p打印奇数行和偶数行

      • sed -n 'p;n' test.txt #奇数行
      • sed -n 'n;p' test.txt #偶数行
      • sed -n '1~2p' test.txt #奇数行
      • sed -n '2~2p' test.txt #偶数行
    12. 匹配关键字并显示后几行

      • sed -n '/3/,$p' a.sh : 显示第一次匹配到的3,到最后一行输出
      • sed -n '/3/,+2p' a.sh : 显示第一次匹配到的3,到向下2行输出

    sed高级说明举例说明

    • seq 4 | sed 'n;d'

        1
        3
      

    说明:pattern space先读入1,然后执行到n,把下一行2读入pattern space中并覆盖原本的1。然后pattern space中的内容(2)被删除(d操作),所以打印出1\n3

    • seq 5 | sed 'n;d'

        1
        3
        5
      
    • seq 4 | sed 'N;d'

        Nothing
      

      说明:pattern space先读入1,然后执行到N,把下一行添加到当前的pattern space中,pattern space内容为1\n2,然后执行d操作被删除。接下去读入3(系统读入总是覆盖原有内容),执行N,pattern space 内容变为3\n4,然后再被删除

    • seq 7 | sed ‘N;d’

        7
      
    • 理解nN

      • seq 4 | sed –n 'n'

          Nothing
        
      • `seq 4 | sed –n ‘N’

          Nothing
        

      以上两都不会输出输入,-n参数把模式空间中的内容关闭显示了

    • `seq 4 | sed –n 'n;p'

        2
        4
      

      说明:-n参数不显示模式空间的内容,n读取下一行并覆盖模式空间的内容,执行p操作

    • seq 4 | sed –n 'N;p'

        1
        2
        3
        4
      

      说明:-n不显示模式空间中的内容,N读取1\n2行的内容,再p命令显示模式空间中的内容

    • seq 5 | sed –n 'N;p

        1
        2
        3
        4
      

      说明:n首先读取1\n2 -->打印模式空间 -->读取3\n4--->打印模式空间--->读取5行发现没有第6行--->失败

    • seq 5 | sed -n 'n;p'

        2
        4
      

      说明:模式空间中有1,然后n使用2覆盖1,再p打印,当执行到第5行时,发现没有下一行了,就不执行n了

    • 理解 x

      • seq 11 | sed -n 'x;p' == seq 11 | sed 'x'

          [sapce line]
          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
        

      说明:模式空间的1<--->保持空间的空白行-->打印模式空间的空行,11并没有打印出来,因为他在保持空间中

      • seq 4 | sed '/3/{x;p;x}'
        1
        2

          3
          4
        

      说明:当匹配到3的时候,执行交换,现在模式空间为空行,保持空间中为3,执行p命令显示模式空间中的空行,x再交换两这空间的内容,此是模式空间为3,默认模式空间的就会输出至标准屏幕,故3之前多了一个空行

      • seq 4 | sed '/3/{x;p;x;d}'

          1
          2
          
          4
        

      说明:当第二个x交换回来,直接交给d执行,故3就没有了,只多了一条空行

    • 理解hH

      • seq 4 | sed 'h;x'

          1
          2
          3
          4
        

      说明:把模式空间中的内容覆盖到保持空间,再交换,再打印至标准输出

      • seq 4 | sed 'x;h'

          Nothing
        

      说明:先把模式空间的与保持空间交换,现在模式空间为空行,保持空间为1,然后再把模式空间覆盖保持空间,再输出至标准输出,故都为空行

    • 理解Gg

      • seq 4 | sed '/3/g'

        1
        2
        
        4
        

      说明:当匹配到3的时候,把保持空间的空行覆盖到模式空间,故就输出了空行

    • seq 3 | sed '1!;G'

      1
      2
      NULL
      3
      NULL
      

    说明: 不是第1行就执行G操作,G是追加保持空间到模式空间,即为2+空行

    • seq 3 | sed '1!G;h;$!d'

      3
      2
      1

    说明:当读到第一行时G不操作,然后把模式空间的内容覆盖到保持空间,然后删除模式空间,此时,保持空间为1,当读到第二行时,把保持空间的内容追加到模式空间,此时模式空间为2\n1,再执行h,把模式空间中的内容再覆盖到保持空间,此时保持空间为2\n1,删除模式空间,读取第3行时,把保持空间的内容追加到模式空间中,此时模式空间的为3\n\2\n1,最后一行不执行d操作

    • 实例

    • sed -n ’n;p’ file : 显示偶数行

    • ed ‘1!G;h;$!d’ :逆序显示内容

    • sed ‘$!d’ file :不是最后一行删除,取出最后一行

    • sed ‘$!N;$!D’: 取出文件后两行

    • sed ‘/^$/d;G’ FILE : 删除原有的所有空白行,而后为所有的非空白行后添加一个空白行

    • sed ’n;d’ FILE:显示奇数行

    • sed ‘G’ /etc/issue: 在原有的每行后方添加一个空白行

    本文借用网络上的文档编辑而成,感谢原作者,如造成影响请通知将其删除,此文用于学习sed工具的使用,网络地址如下:
    http://www.1987.name/306.html; http://bbs.chinaunix.net/thread-3763371-1-1.html

    相关文章

      网友评论

        本文标题:Linux之Sed工具的使用详解

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