• Shell sed编辑器


    sed编辑器被称作流编辑器(stream editor),和普通的交互式文本编辑器恰好相反。

    在交互式 文本编辑器中(比如vim ),你可以用键盘命令来交互式地插入、删除或替换数据中的文本。流编 辑器则会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流
    sed 编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储
    在一个命令文本文件中

    sed编辑器会执行的操作:

    • 一次从输入中读取一行数据
    • 根据所提供的编辑器命令匹配数据
    • 按照命令修改流中的数据
    • 将新的数据输出到STDOUT

    流编辑器处理完流中的所有数据行后,才会终止。

    sed的命令格式:

     sed   options   script    file

    选项允许修改sed命令的行为选项:

    选项描述
    -e  script在处理输入时,将script中指定的命令添加到已有的命令中
    -f   file 在处理输入时,将file中指定的命令添加到已有的命令中
    -n不产生命令输出,使用print命令来完成输出

    1. s关键词: 用后面的字符替换前面的字符

    使用方法:

    sed  's/旧字符/新字符/'

    注意:只替换每行第一个匹配的字符

    例子:在一个文件输入以下内容

     注意:这样使用并不会修改原文件内容,它只会将修改后的数据发送到STDOUT

    2.在命令行中使用多个编辑命令:

    使用多个编辑命令时,需要使用  -e   选项

    两个命令都作用到文件中的每行数据上。命令之间必须用分号隔开,并且在命令末尾和分号之间不能有空格。

    注意:命令行要在封尾单引号所在行结束命令

     或者使用另一种格式:(进入sed编辑器命令列表

    3.从文件中读取编辑命令

    需要使用   -f    来指定文件(sed的命令文件一般指定为   .sed 结尾)

    例子:创建一个文件保存sed命令

     命令行使用:

    其他替换选项:

    替换标志符:

    替换标识符放在命令字符串之后

    • 数字   标明新文本将替换第几处模式匹配的地方
    • g         表明新文本将会替换所有所匹配的文本
    • p         表明原先行的内容要打印出来
    • w  file  将替换的结果写到文件中

    1.数字(n):只替换每行第n个匹配的地方

     

     2.g  表明新文本将会替换所有所匹配的文本

    3. p  表明原先行的内容要打印出

    通常和-n一起使用,这样就输出被替换命令修改过的行

     4.w  file  将替换的结果写到文件中

     替换特殊字符的方法:

    • 需要用转义字符
    • 使用!作为分隔符

    例子:C shell替换/etc/passwd文件中的bash shell 

    1.  / (正斜线),出现在了模式文本中的话,必须用反斜线来转义(比较麻烦,不推荐使用)

    sed 's/\/bin\/bash/\/bin\/chs/' /etc/passwd
    2. 使用!作为分隔符
    sed 's!/bin/bash!/bin/csh!'  /etc/passwd

    地址的使用:

    由于sed命令会作用于文本内容的所有行,想要单独的作用于某些行,需要使用行寻址。

    1.行寻址的方式:

    • 以数字形式表示行区间 (数字放置在s前面)(编号以1开头)
    • 用文本模式来过滤出行

    1.使用数字的形式表示

    • sed '3s/people/man/' sedtext.txt   替换第3行
    • sed '3,5s/people/man/' sedtext.txt   替换3-5行,是一个区间
    • sed '3,$s/people/man/' sedtext.txt   替换3到结尾的所有行

    2.文本模式过滤器:

    sed编辑器允许指定文本模式来过滤出命令要用的行。

    格式:    /patten/command

    例子:修改用户man 的默认shell

    2.命令组合

     在单行或多行执行多条命令,使用{}将多条命令组合在一起

    格式:

    sed ’行寻址{

    commands

    }'   file

    指定第3行修改

     指定第3-5行修改

    3.删除行

    格式:sed '寻址d'  file

    • sed   'd'  file    流中的文本都会删除

     删除单行:

     

    删除多行: 

     使用sed编辑器的模式匹配删除行:删除含有 is 的行

     注意:sed不会删除源文件的内容

     易错点:使用两个文本模式来删除某个区间内的行

    第一个模式会”打开“行删除功能,第二个模式会“关闭”行删除功能

    sed 编辑器会删除两个指定行之间的所有行(包括指定的行)。
    • 要先打开才能使用
    • 有打开没关闭,会删除打开后的数据,直到遇到下一个开关

    例一:有打开有关闭 (删除区间内的数据)

     

     例二:有打开没有关闭 (会删除开始后的数据)

     例三:没打开有关闭(没打开,相当于不会执行)

    例四:组合使用

    4.插入和添加:

    • 插入:     i (insert)  在指定行增加一个新行
    • 添加:    a(append)在指定行增加一个新行

     格式: sed ' [address]command\new line'

    格式1:

     格式2:

     把新行添加到最后一行:

    5.修改行

    修改: c(change)和添加的用法一致,但必须单独指定新行

     使用文本模式修改命令修改行

     注意点:使用区间时,用该行替换区间的行

    6.转换命令(处理单字符)

     y命令(transform)是唯一可以处理单个字符的sed编辑器命令

    格式:

    [address]y/inchars/outchars/

    注意:inchars和outchars的值存在一对一的映射

     例子:把g换为P  把 p换成 Q   把e换成K

    7. 打印

    • p     命令打印文本行
    • =     命令用来打印行号
    • l       命令 用来列出行

    1.    p  打印文本行(会打印两份数据)

    使用-n 限制,打印一份数据

      

     2.   =   命令用来打印行号

     3.   l   列出行 (可以打印数据流中的文本和不可打印的ASCII字符任何不可打印字符要么在其八进制值前加一个反斜线,要么使用标准C风格的命名法

     

     用$代表换行符

    sed对文件的操作

    1.写入文件:

    使用 w 命令

    格式为:

    [address]w filename

     2.从文件中读取数据

    读取(read)命令(r)允 许你将一个独立文件中的数据插入到数据流中

    使用 r 命令

    格式:

    [address]r filename

     将该文件的数据添加到 sedtext.text 文件末

    多行命令:

    sed处理多行文本的特殊命令:

    • N  将数据流中的下一行加进来创建一个多行组来处理
    • D  删除多行组中的一行
    • P  打印多行组中的一行

     next命令:

    • n    对单行操作
    • N   对多行操作

    1.对单行操作:小写的n命令告诉sed编辑器移动到数据流的下一行

    删除匹配行的下一行。

     2.合并文本行:大写的N会把下一行文本添加到模式空间中已有的文本后,将数据流中的两个文本行合并到同一个模式空间中文本行仍然用换行符分隔,但sed编辑器现在会将两行文本当成一行来处理。

    把匹配行的下一行添加到该行的末尾并用空格隔开

     分别位于两行的单词替换:先合并然后再替换

     

     注意:由于最后一行没有下一行,所以无法执行,

    最好的方法是,先筛选第一行是否是连续的 ,然后再合并检验是否是分开或连续的词组

     多行删除命令:

    • 单行删除用(d)
    • 多行删除用(D)

    使用 d 和 N 一起使用时,删除的是两行

    使用 D和 N一起使用时 ,删除的是模式空间的第一行,会删除到换行符为止的所有字符。

    1.先筛选再删除,只删除一行(筛选行放入模式空间)

    2.先合并再删除,删除两行(两行放入模式空间) 

     多行打印命令:

    • 打印命令 p
    • 多行打印命令  P

     当有多行匹配时P命令只会打印模式空间中的第一行

    保持空间

    sed编辑器除了有模式空间,还用保持空间的缓冲区域,可以临时存放一些数据行。

     

    排除命令(!)

    !命令,用来排除命令,让原本会起作用的命令失效。

     不输出所匹配的内容

    改变流

    1.分支

    sed编译器提供了一种方法,可以基于地址、地址模式或地址区间排除一整块命令。这允许你只对数据流中的特定行执行一组命令。

    分支  b(branch)格式:

    [address]b [label] 

    • adderss决定哪些会触发分支
    • label 决定跳到的位置(默认跳到脚本结尾)
      • 可以使用标签进行跳转,格式    :名称

    2,3,4行触发分支,不会执行命令 

     标签的使用:

      2.测试

    t (test)测试,可以用来改变sed脚本的执行流程,测试命令会根据替换命令的结果跳转到某个标签,而不是根据地址跳转,替换命令如果成功匹配并替换一个模式,测试命令就会跳到指定标签。

    格式:

    [ address ] t [ label ]

     标签的使用(循环去除空格)

    模式替代:

    如何在匹配单词添加其他字符

    例如把 man  改为  "man"

     & 可以用来代替命令中的匹配的模式,可以使用&来代替该文本,这样的话可以修改匹配到的单词。

     &修改的是整个单词,如何提取单词的一部分。

    sed编译器用圆括号来定义替换模式中的子模式,可以在替代模式中使用特殊字符来引用每一个子模式。代替字符由反斜杠和数字组成。数字表明子模式的位置。sed编辑器会给模式分配字符\1,第二个子模式分配符\2 .....。

    注意:在替换命令中使用括号时,需要用转义字符,代表不是普通的括号。

    先用括号将the括起来,将其标示为一个子模式,\1 来提取第一个匹配的子模式

    注意:括号里面的内容是不会被替换的,只是一个标记

     先用括号括起the   需要替换的内容为 man  再把 isagood括起来  需要替换的内容为 man

    \1 替换第一个man  \2 替换的是第二个man

     

     例子:将,穿插进字符串(使用{  }和text)

     

    sed的一些使用技巧:

    使用保持空间来输出空行:

    原理为 保持空间没有内容时是空行,所以执行  G  会把保持空间的内容输出到模式空间

    生成空行

  • 相关阅读:
    adb shell getprop 获取系统属性
    BERT-of-Theseus
    【精华】ubuntu编译openpose
    Nvidia显卡基础概念介绍
    优化单元测试效率:Spring 工程启动耗时统计
    基于SSM的生鲜配送系统的设计与实现
    cmake是什么,为什么现在都用cmake,cmake编译原理和跨平台示例
    【树莓派不吃灰】基础篇⑲ 搭建usb摄像头MJPG-streamer图片流监控,支持远程视频监控访问
    C++基础——匿名对象介绍、拷贝对象时的一些编译器优化
    Android多线程学习:线程池(一)
  • 原文地址:https://blog.csdn.net/qq_45303986/article/details/126922720