• 【转载更新】Linux工具之SED 1.基础知识


    一、SED简介
      sed是一个非交互式的流编辑器。所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出;而所谓流编辑器,是指sed每次只从文件(或输入)读入一行,然后对该行进行指定的处理,并将结果输出到屏幕(除非取消了屏幕输出又没有显式地使用打印命令),接着读入下一行。整个文件像流水一样被逐行处理然后逐行输出。
          sed可以对数据行进行增删改、替换、插入、合并等操作.
     
     
    二、SED的工作原理
      下面我们看一下sed的工作过程。
       sed不是在原输入上直接进行处理的,而是先将读入的行放到缓冲区中,对缓冲区里的内容进行处理,处理完毕后也不会写回原文件(除非用shell的输出重定向来保存结果),而是直接输出到屏幕上。sed运行过程中维护着两个缓冲区,一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“暂存缓冲区(holding space)”。一般情况下,每当运行sed,sed首先把第一行装入模式空间,进行处理后输出到屏幕,然后将第二行装入模式空间替换掉模式空间里原来的内容,然后进行处理,以此类推。
    一般情况下暂存缓冲区是用不到的,但有特殊的命令可以在模式空间与暂存缓冲区之间交换数据,后文将有介绍。由于sed对文本的所有操作都是在缓冲区里进行的,所以不会对原文件造成任何破坏。
    三、SED的用法(命令格式)
          sed [option]     'command'               输入文件            ##在命令行使用sed命令,实际命令要加单引号
          sed [option]    -f sed脚本文件           输入文件

            其中,command是一个sed命令,sed命令一定要被包含在一对单引号中,以免被shell解释,其格式如下:
    [address-range][sed-command]或[pattern-to-match][sed-command]
    address-range是指要处理的行的范围,又叫地址范围;pattern-to-match是一个要匹配的模式,是一个正则表达式,sed-command是一个sed命令,用来对指定的行进行处理。

     
    四、SED如何定址?
      x                                            x为一行号,比如1
          x,y                 表示行号范围从x到y,如2,5表示从第2行到第5行
          /pattern/              查询包含模式的行,如/disk/或/[a-z]/
          /pattern/pattern/          查询包含两个模式的行,如/disk/disks/
          /pattern/,x             在给定行号上查询包含模式的行,如/disk/,3
          x,/pattern/                               通过行号和模式查询匹配行,如 3,/disk/
          x,y!                  查询不包含指定行号x和y的行
    五、基本的编辑命令
        p      打印匹配行                                  c/    用新文本替换定位文本
        =      显示文件行号                                 s     使用替换模式替换相应模式
        a/     在定位行号后附加新文本信息                 r     从另一个文本中读文本
        i/     在定位行号后插入新文本信息                  w     写文本到一个文件
        d      删除定位行                                           q     第一个模式匹配完成后退出或立即退出
        l      显示与八进制ASCII代码等价的控制字符            y     传送字符
        n      从另一个文本中读文本下一行,并附加在下一行      {}     在定位行执行的命令组
        g      将模式2粘贴到/pattern n/
    六、基本sed编程举例:
        使用p(rint)显示行:     sed -n '2p' temp.txt          只显示第2行,使用选项n
        打印范围:          sed -n '1,3p' temp.txt           打印第1行到第3行
        打印模式:          sed -n '/movie/'p temp.txt       打印含movie的行
        使用模式和行号查询:     sed -n '3,/movie/'p temp.txt    只在第3行查找movie并打印
        显示整个文件:        sed -n '1,$'p temp.txt           $为最后一行
        任意字符:          sed -n '/.*ing/'p temp.txt          注意是.*ing,而不是*ing
        打印行号:          sed -e '/music/=' temp.txt
        插入文本:             /name1/ a/       改成 4 i/ 4表示行号,i插入
        修改文本:             /name1/ a/       改成 /name1/ c/ 将修改整行,c修改
        删除文本:          sed '1d' temp.txt  或者 sed '1,4d' temp.txt
        替换文本:          sed 's/source/OKSTR/' temp.txt       将source替换成OKSTR
                           sed 's//$//g' temp.txt                 将文本中所有的$符号全部删除
                           sed 's/source/OKSTR/w temp2.txt' temp.txt 将替换后的记录写入文件temp2.txt
        替换修改字符串: sed 's/source/"ADD BEFORE" &/p' temp.txt
                           结果将在source字符串前面加上"ADD BEFORE",这里的&表示找到的source字符并保存
        sed结果写入到文件:     sed '1,2 w temp2.txt' temp.txt
                                    sed '/name/ w temp2.txt' temp.txt
        从文件中读文本:         sed '/name/r temp2.txt' temp.txt
        在每列最后加文本:          sed 's/[0-9]*/& Pass/g' temp.txt
        从shell向sed传值:          echo $NAME | sed "s/go/$REP/g"   注意需要使用双引号
        附加文本:(创建sed脚本文件)chmod u+x script.sed,运行时./script.sed temp.txt
            #!/bin/sed -f
            /name1/ a/             #a/表示此处换行添加文本
            HERE ADD NEW LINE.     #添加的文本内容
  • 相关阅读:
    js的style.width取不到元素的宽度值
    git bush 无法使用箭头进行选择
    exports module.exports export export default之间的关系
    vue前端项目中excel文件下载
    vue -- router路由跳转错误 , NavigationDuplicated
    node url模块
    SSO CAS 单点系列
    离线电脑搭建开发环境
    Shader的语法
    NavMesh名字、层索引、层值之间的转换
  • 原文地址:https://www.cnblogs.com/tango-dg/p/3924846.html
Copyright © 2020-2023  润新知