• Linux三剑客之sed流编辑器


    一、功能说明

    Sed是Stream Editor(流编辑器)缩写,是操作、过滤和转换文本内容的强大工具。常用功能有增删改查,过滤,取行。

    二、语法格式

    Usage: sed [options] [sed-commands] [input-file]
                          选项           sed命令         出入文件

    三、常用参数和选项

    -n 取消默认的sed输出,常与sed内置命令的p连用
    -i 直接修改文件内容,而不是输出到终端
    -r 使用扩展正则表达式
    -e 执行多条sed命令
    -f 后接sed脚本文件名
    a 在指定行后添加一行或多行文本
    d 删除一行或多行文本
    i 在指定行前添加一行或多行文本
    p 打印匹配行的内容
    c 用新行取代旧行
    s 替换指定字符
    l 输出不可见字符
    g 获得内存缓冲区的内容,并替代当前模板块中的文本
    & 匹配到的文本
    e 将输出内容当做bash命令执行
    n 清空当前模式空间,然后读取下一行
    N 追加下一个输入行到模板块后面并在二者间嵌入一个新行
    = 列出行数

    四、使用范例

    1、实验文本

    [root@WT data]# cat test.txt 
    101,xiaoming,CEO
    102,zhangsan,CTO
    103,wangwu,COO
    104,gg,CFO
    105,xiaobai,CIO

    2、增删改查

    2.1、增

      a  在指定文本行后添加一行或多行文本

      i   在指定文本行前添加一行或多行文本

    2.1.1、增加单行文本
    [root@WT data]# sed '2a 106,huahua,yuangong' test.txt
    101,xiaoming,CEO
    102,zhangsan,CTO
    106,huahua,yuangong
    103,wangwu,COO
    104,gg,CFO
    105,xiaobai,CIO
    [root@WT data]# sed '2i 106,huahua,yuangong' test.txt
    101,xiaoming,CEO
    106,huahua,yuangong
    102,zhangsan,CTO
    103,wangwu,COO
    104,gg,CFO
    105,xiaobai,CIO
    2.1.2、增加多行文本
    [root@WT data]# sed '2a 106,huahua,yuangong
    107,fengxue,zhuguan' test.txt
    101,xiaoming,CEO
    102,zhangsan,CTO
    106,huahua,yuangong
    107,fengxue,zhuguan
    103,wangwu,COO
    104,gg,CFO
    105,xiaobai,CIO
    [root@WT data]# sed '2i 106,huahua,yuangong
    107,fengxue,zhuguan' test.txt
    101,xiaoming,CEO
    106,huahua,yuangong
    107,fengxue,zhuguan
    102,zhangsan,CTO
    103,wangwu,COO
    104,gg,CFO
    105,xiaobai,CIO

    2.2、删

      d  删除一行或多行文本
    2.2.1、删除文件全部文本内容
    [root@WT data]# sed 'd' test.txt
    [root@WT data]# 
     2.2.2、删除指定一行的文本
    [root@WT data]# sed '2d' test.txt
    101,xiaoming,CEO
    103,wangwu,COO
    104,gg,CFO
    105,xiaobai,CIO
    2.2.3、删除指定的多行文本
    [root@WT data]# sed '2,3d' test.txt
    101,xiaoming,CEO
    104,gg,CFO
    105,xiaobai,CIO
     2.2.4、删除某行及之后的所有文本
    [root@WT data]# sed '3,$d' test.txt
    101,xiaoming,CEO
    102,zhangsan,CTO
    2.2.5、从某行开始删除间隔为N的行
    [root@WT data]# sed '1~2d' test.txt
    102,zhangsan,CTO
    104,gg,CFO
    2.2.6、从删除某行以及删除此行后面的N行
    [root@WT data]# sed '1,+2d' test.txt
    104,gg,CFO
    105,xiaobai,CIO
    2.2.7、删除有指定字符串的行
    [root@WT data]# sed '/xiaoming/d' test.txt
    102,zhangsan,CTO
    103,wangwu,COO
    104,gg,CFO
    105,xiaobai,CIO
    2.2.8、删除指定“字符1”到指定“字符串2”的行
    [root@WT data]# sed '/xiaoming/,/wangwu/d' test.txt
    104,gg,CFO
    105,xiaobai,CIO
    2.2.9、删除指定字符串的行到第N行
    [root@WT data]# sed '/xiaoming/,3d' test.txt
    104,gg,CFO
    105,xiaobai,CIO

    2.3、改 

    2.3.1、修改指定的行

      c  用新行取代旧行

    [root@WT data]# sed '1c 100,xiaoming02,CEO' test.txt
    100,xiaoming02,CEO
    102,zhangsan,CTO
    103,wangwu,COO
    104,gg,CFO
    105,xiaobai,CIO
    2.3.2、文本替换

    s  替换指定字符
    g 获得内存缓冲区的内容,并替代当前模板块中的文本
    -i 直接修改文件内容,而不是输出到终端

    sed文本替换说明

    sed -i 's/▇/▲/g'  xxx.txt 
    sed -i 's#▇#▲#g'  xxx.txt

    1、两边是引号,引号里面的两边分别为s和g,中间是三个一样的字符/或#作为定界符。#能在替换内容包含/有助于区别。定界符可以是任意符号如:或|等,但当替换内容包含定界符时,需转义即: |。这里建议使用#作为定界符。
    2、定界符/或#,第一个和第二个之间的就是被替换的内容,第二个和第三个之间的就是替换后的内容。
    3、s#▇#▲#g,▇能用正则表达式,但▲不能用,必须是具体的。
    4、默认sed软件是对模式空间(内存中的数据)操作,而-i选项会更改磁盘上的文件内容。

    [root@WT data]# sed 's#xiaoming#xiaoming02#g' test.txt
    101,xiaoming02,CEO
    102,zhangsan,CTO
    103,wangwu,COO
    104,gg,CFO
    105,xiaobai,CIO
    2.3.3、指定行进行文本替换
    [root@WT data]# sed '1s#101#100#g' test.txt
    100,xiaoming,CEO
    102,zhangsan,CTO
    103,wangwu,COO
    104,gg,CFO
    105,xiaobai,CIO
    2.3.4、分组替换()和1的使用说明

    sed流编辑器的()最多可以使用9个,()里面可以使用正则表达式,1表示第一个()匹配到的内容,2以此类推。

    [root@WT data]# echo "101,xiaoming,CEO"|sed -nr 's#^.*,(.*),CEO$#1#gp'
    xiaoming
    2.3.5、&符号的使用说明

      &表示用sed匹配到的文本

      范例说明,把test.txt文件名改为test.dat

    1 [root@WT data]# ls|sed -nr 's#(.*).txt#&#gp'
    2 test.txt
    3 [root@WT data]# ls|sed -nr 's#(.*).txt#1,&#gp'
    4 test,test.txt
    5 [root@WT data]# ls|sed -nr 's#(.*).txt#mv & 1.dat#gp'
    6 mv test.txt test.dat
    7 [root@WT data]# ls|sed -nr 's#(.*).txt#mv & 1.dat#gp'|bash
    8 [root@WT data]# ls
    9 test.dat

     2.4、查

      p  输入匹配行的内容,默认sed会输出一次,加上p之后就会输出两次,所有n取消sed的默认输出。

    2.4.1、按行查询
    [root@WT data]# sed '5p' test.txt
    101,xiaoming,CEO
    102,zhangsan,CTO
    103,wangwu,COO
    104,gg,CFO
    105,xiaobai,CIO
    105,xiaobai,CIO
    [root@WT data]# sed -n '5p' test.txt
    105,xiaobai,CIO
    2.4.2、输出指定范围的行
    [root@WT data]# sed -n '1,2p' test.txt
    101,xiaoming,CEO
    102,zhangsan,CTO
    2.4.3、从某行开始依次输出间隔为N的行
    [root@WT data]# sed -n '1~2p' test.txt
    101,xiaoming,CEO
    103,wangwu,COO
    105,xiaobai,CIO
    2.4.4、输出全部的行
    [root@WT data]# sed -n 'p' test.txt
    101,xiaoming,CEO
    102,zhangsan,CTO
    103,wangwu,COO
    104,gg,CFO
    105,xiaobai,CIO
    2.4.5、输出指定字符串的行
    [root@WT data]# sed -n '/gg/p' test.txt
    104,gg,CFO
    2.4.6、其他查询方法
    [root@WT data]# sed -n '1,/COO/p' test.txt
    101,xiaoming,CEO
    102,zhangsan,CTO
    103,wangwu,COO

    3、内容另存为 

    w  把sed模式空间的内容另存为一个新文件中

     1 [root@WT data]# cat num.txt 
     2 1 1 1 1 1
     3 1 1 1 1 1
     4 1 1 1 1 1
     5 [root@WT data]# sed 's#1#0#g;w output.txt' num.txt 
     6 0 0 0 0 0
     7 0 0 0 0 0
     8 0 0 0 0 0
     9 [root@WT data]# cat output.txt 
    10 0 0 0 0 0
    11 0 0 0 0 0
    12 0 0 0 0 0

    4、执行命令

    e  把模式空间的内容当作bash执行

    [root@WT data]# ls|sed -nr 's#(.*).txt#mv & 1.dat#gpe'
    mv test.txt test.dat
    [root@WT data]# ls
    test.dat

     5、一条sed语句执行多个命令

    -e或";"分号  执行多条sed语句的命令

    [root@WT data]# sed -e 's#101#100#g' -e 's#105#500#g' test.txt 
    100,xiaoming,CEO
    102,zhangsan,CTO
    103,wangwu,COO
    104,gg,CFO
    500,xiaobai,CIO
    [root@WT data]# sed  's#101#100#g;s#105#500#g' test.txt 
    100,xiaoming,CEO
    102,zhangsan,CTO
    103,wangwu,COO
    104,gg,CFO
    500,xiaobai,CIO

     6、n的使用说明

    [root@WT data]# cat test.txt 
    101,xiaoming,CEO
    102,zhangsan,CTO
    103,wangwu,COO
    104,gg,CFO
    105,xiaobai,CIO
    [root@WT data]# sed  -n 'n;p' test.txt 
    102,zhangsan,CTO
    104,gg,CFO

     7、"="的使用说明

    [root@WT data]# sed  '=' test.txt 
    1
    101,xiaoming,CEO
    2
    102,zhangsan,CTO
    3
    103,wangwu,COO
    4
    104,gg,CFO
    5
    105,xiaobai,CIO
  • 相关阅读:
    Android中NFC编程
    动态的改变程序的主题
    第二章 Libgdx的目标和特性
    第一章 Libgdx简介
    JAVA过滤器和拦截器的区别(个人理解)
    Android下Activity的生命周期
    Ext JS 4.2.1 Beta 1发布了
    【翻译】Ext JS 4.2介绍
    jQuery 1.5发布 Ajax模块重写
    ASP.NET 服务器控件渲染到客户端之后对应的HTML标签
  • 原文地址:https://www.cnblogs.com/wutao666/p/9667546.html
Copyright © 2020-2023  润新知