【转载更新】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.     #添加的文本内容
原文地址:https://www.cnblogs.com/tango-dg/p/3924846.html