zoukankan      html  css  js  c++  java
  • Shell:sed工具

    简介

    sed (stream editor, 流编辑器) 是Linux下一款功能强大的非交互流式文本编辑器(vim是交互式文本编辑器),可以对文本文件的每一行数据匹配查询之后进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容,灵活方便,特别适合于大文件的编辑.

    sed是一种流编辑器,它一次处理一行内容, 将这行放入缓存(存区空间称为:模式空间),然后才对这行进行处理,处理完后,将缓存区的内容发送到终端。

    sed处理数据原理:

    image-20210709090025997

    语法

    sed [选项参数] [模式匹配/sed程序命令] [文件名]
    
    # 模式匹配,sed会读取每一行数据到模式空间中, 之后判断当前行是否符合模式匹配要求,符合要求就会
    # 执行sed程序命令, 否则不会执行sed程序命令;如果不写匹配模式,那么每一行都会执行sex程序命令
    

    选项参数说明:

    选项参数 功能
    -e 直接在指令列模式上进行sed的动作编辑。它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项;一行命令语句可以执行多条sed命令
    -i 直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改
    -f 后跟保存了sed指令的文件(保存到其他文件输出)
    -n 取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
    -r ruguler 使用扩展正则表达式,默认情况sed只识别基本正则表达式 *

    sed程序命令功能描述:

    命令 功能描述
    a add新增,a的后面可以接字串,在下一行出现
    c change更改, 更改匹配行的内容
    d delete删除, 删除匹配的内容
    i insert插入, 向匹配行前插入内容
    p print打印, 打印出匹配的内容,通常与-n选项和用
    s substitute替换, 替换掉匹配的内容
    = 用来打印被匹配的行的行号
    n 读取下一行,遇到n时会自动跳入下一行

    特殊符号

    命令 功能描述
    ! 就像一个sed命令,放在限制条件后面, 对指定行以外的所有行应用命令(取反)
    {sed命令1;sed命令2} 多个命令操作同一个的行

    实战

    准备数据:

    vi sed.txt
    
    QWE
    shanghai shanghai
    nanjing
    1234
    nanjing
    

    向文件添加数据

    在第三行后面添加数据

    sed -i '3ahello' sed.txt
    

    image-20210709091327674

    在第三行前面添加数据

    sed -i '3ihello' sed.txt
    

    image-20210709091437766

    在指定内容前后添加数据:在shanghai字符串后面插入hi

    sed -i '/shanghai/ahi' sed.txt
    

    image-20210709094055135

    在最后一行后添加数据:

    sed -i '$ahaha' sed.txt
    

    image-20210709094259960

    删除文件中的数据

    删除第三行数据:

    sed -i '3d' sed.txt
    

    image-20210709094524115

    删除奇数行:

    #从第一行开始删除,每隔两行就删掉一行
    #不加选项参数-i,只预览结果不修改文件
    sed '1~2d' sed.txt
    

    image-20210709095314587

    删除指定范围多行数据

    #删除1到3行
    sed '1,3d' sed.txt
    

    image-20210709095520623

    删除不在指定范围的多行数据

    #删除不在1,3行的数据
    sed '1,3!d' sed.txt
    

    image-20210709095720610

    删除最后一行

    sed '$d' sed.txt
    

    image-20210709095751984

    删除匹配内容的行

    #删除含有hello的行
    sed '/hello/d' sed.txt
    

    image-20210709095853895

    删除匹配行及其后面一行

    sed '/hello/,+1d' sed.txt
    

    image-20210709100012751

    删除不匹配行

    #删除不匹配shanghai或nanjing的行
    sed '/shanghai|nanjing/!d' sed.txt
    

    image-20210709100156482

    更改文件数据

    更改第一行

    #更改第一行为hello
    sed '1chello' sed.txt
    

    image-20210709100431529

    将包含shanghai的行修改为beijing

    sed  '/shanghai/cbeijing' sed.txt
    

    image-20210709100543473

    将最后一行修改为hello

    sed '$chello' sed.txt
    

    image-20210709100623476

    将文件中每行第一个shanghai替换为beijing

    sed  's/shanghai/beijing/' sed.txt
    

    image-20210709100818054

    全局匹配替换shanghai为beijing

    sed  's/shanghai/beijing/g' sed.txt
    

    image-20210709100903525

    将文件中每行第二个shanghai替换为beijing

    sed  's/shanghai/beijing/2' sed.txt
    

    image-20210709101005916

    将每行中第二个匹配的shanghai替换为beijing , 将替换后的内容写入到sed2.txt文件中

    # 第一种方式
    sed -n 's/shanghai/beijing/2pw sed2.txt' sed.txt
    # w写入
    # p打印, -n只是获取匹配的行
    
    # 第二种方式
    sed -n 's/shanghai/beijing/2p ' sed.txt > sed2.txt
    

    image-20210709101242969

    正则表达式匹配替换:

    #匹配有 `i` 的行,替换匹配行中 `h` 后的所有内容为空 
    sed '/i/s/h.*//' sed.txt
    

    image-20210709102752847

    每行末尾拼接 java

    sed 's/$/& java/' sed.txt
    

    image-20210709102919180

    每行行首添加#

    sed 's/^/&#/' sed.txt
    

    image-20210709103055616

    查询

    查询含有shanghai的行

    sed -n '/shanghai/p' sed.txt
    

    image-20210709103507029

    多个sed执行:将sed.txt文件中的第1行删除并将 shanghai 替换为 baijing

    # 第一种方式, 多个sed程序命令 在每个命令之前使用 -e 参数
    sed -e '1d' -e 's/shanghai/beijing/g' sed.txt 
    # 第二种方式
    sed  '1d;s/shanghai/beijing/g' sed.txt
    

    image-20210709103934210

    sed高级用法:缓存区数据交换

    模式空间与暂存空间介绍

    1. 首先需要明白, sed处理文件是逐行处理的, 即读取一行处理一行,输出一行;

    2. sed把文件读出来每一行存放的空间叫模式空间, 会在该空间中对读到的内容做相应处理;

    3. 此外sed还有一个额外的空间即暂存空间, 暂存空间刚开始里边只有个空行, 记住这一点;

    4. sed可使用相应的命令从模式空间往暂存空间放入内容或从暂存空间取内容放入模式空间;

      2个缓存空间传输数据的目的是为了更好的处理数据。

    关于缓存区sed程度命令

    命令 含义
    h 模式空间里面的内容复制到暂存空间缓存区(覆盖方式)
    H 模式空间里面的内容复制到暂存空间缓存区(追加方式)
    g 暂存空间里面的内容复制到模式空间缓存区(覆盖方式)
    G 暂存空间里面的内容复制到模式空间缓存区(追加方式)
    x 交换2个空间的内容

    案例

    缓存空间数据交换

    第一行粘贴到最后一行(附加方式)

    sed '1h;$G' sed.txt
    

    image-20210709111209913

    第一行删除后粘贴到最后一行

    sed '1{h;d};$G' sed.txt
    

    image-20210709111359791

    第一行数据复制粘贴替换其他行数据

    sed '1h;2,$g' sed.txt
    

    image-20210709111507137

    将前3行数据数据复制粘贴到最后一行(追加)

    sed '1,3H;$G' sed.txt
    

    image-20210709111715162

    给每一行添加空行

    #暂存空间默认就有空行
    sed 'G' sed.txt
    

    image-20210709111817037

  • 相关阅读:
    Ubuntu下下载Android源码
    升级Android 3.1ADT 和SDK
    ubuntu10.04手动安装jdk1.6.0_24配置
    安装VM Tools
    Singleton (单件模式)
    biztalk2004安装时应该注意的几点
    欢迎高手加入.NET技术群
    Observer(观察者模式)
    无眠
    A⑤权限管理分配权限:提交的是节点的id列表
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/14989776.html
Copyright © 2011-2022 走看看