zoukankan      html  css  js  c++  java
  • 自学Linux Shell18.1-sed编辑器基础特性

    点击返回 自学Linux命令行与Shell脚本之路

    18.1-sed编辑器基础特性

    linux世界中最广泛使用的两个命令行编辑器:

    • sed
    • gawk

    1. sed概念

    sed是stream editor的简称,也就是流编辑器。sed 是一种在线编辑器,它一次处理一行内容。sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。

    sed编辑器会执行以下操作:

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

              在流编辑器将所有命令和一行数据匹配完毕后,它会读取下一行数据重复这个过程。

    解析:

    首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。

    2. sed命令格式

    1 sed OPTIONS... <SCRIPT> [INPUTFILE...]
    • -n 使用安静(silent)模式(想不通为什么不是-s)。在一般sed的用法中,所有来自stdin的内容一般都会被列出到屏幕上。但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者动作)才会被列出来;
    • -e 直接在指令列模式上进行 sed 的动作编辑;
    • -f 直接将 sed 的动作写在一个文件内, -f filename 则可以执行filename内的sed命令;
    • -r 让sed命令支持扩展的正则表达式(默认是基础正则表达式);
    • -i 直接修改读取的文件内容,而不是由屏幕输出。

    2.1 在命令行定义sed编辑器命令

    sed中y命令与s命令的区别

    • y一般是行级别的替换,s一般是列级别替换(当然也可以转换成行级)
    • s替换的是整体,y替换的是每一字母对应的单个字母, 会用斜线间的第二个文本字符串来替换第一个文本字符串

    2.2 在命令行使用多个sed编辑器命令

    • 在命令行使用多个sed编辑器命令,就需要使用 -e 选项
    • 同时使用多个编辑命令,命令之间要用;隔开(!除外),并且在命令末尾和分号之前不能有空格
    • 也可以使用次提示符来分割命令

     

    2.3 在文件中读取sed编辑器命令

     在sed命令中用 -f 选项来制定文件。这种情况下,不用在每条命令后面放一个分号。

     

    3. sed编辑器基础 

    3.1 更多的替换选项

    S命令:行中替换文本,替换的是整体,默认情况下只替换没行中出现的第一处 

       s/原文本/新文本/标记位 ,   标记为如下:

    •   p  :显示替换成功的行    
    •   g  :全局替换
    •   w  filename : 将替换成功的结果保存至指定文件中
    • 数字: 标明新文本将替换第几处模式匹配的地方

    3.2  使用地址

    如果只想将命令作用在特定行货某些行,就必须使用 行寻址 。

    在sed编辑器中有两种形式的行寻址:

    • 以数字形式表示行区间
    • 用文本模式来过滤行

     指定的格式一:

    1 [address] command

     指定的格式二(多个命令组):

    1 address] {
    2    command1
    3    command2
    4    command3
    5    ....
    6 }

    3.2.1 数字方式的行寻址

    使用数字方式的行寻址,可以用行的文本流中的行位置来引用。

    • 在命令中指定的地址可以使单个行号,或是用起始行号、逗号以及结尾行号指定的一个区间范围内的行
    • 可以使用行地址区间
    • 可以使用 $ 符号,将命令作用到文本中从某行开始的所有行。

    3.2.2  使用文本模式过滤器

    格式:  /pattern/command 

    • 必须使用/将要指定的pattern封起来
    • 会将该命令作用到包含指定文本模式的行上。

    3.2.3   命令组合

    •  如果需要在单行上执行多条命令,可以使用花括号将多条命令组合在一起
    • 也可以在一组命令前指定一个地址区间

     

    3.3  删除行 d命令

    之前讲的都是替换命令s , 其实还有很多其他命令。

    删除命令d ,会删除匹配指定寻址模式的所有行。

    • 若没有添加寻址模式,所有文本行都会被删除
    • 通过行号指定或区间指定或特殊符号&,可以删除特定的文本行
    • sed编辑器的模式匹配也适用于删除命令
    • 重点: 没有删除原文本 

     

    3.4  插入和附件文本

    • 插入命令 i 会在指定行前增加一个新行, 文本会出现在数据流文本的前面。
    • 附加命令 a 会在指定行后增加一个新行, 文本会出现在数据流文本的后面。  
    • 他们不能再单个命令行上使用,必须指定是要将行插入还是附加到另一行
    • 通过行号指定或区间指定或特殊符号&,可以插入或附加特定的文本行
    • $a 可以直接附件在文本最后一行
    • 要插入或附加多行文本,必须要插入或附加的新文本的每一行使用反斜线
    • sed编辑器的模式匹配也适用

    格式 :

    1 sed  '[address] command
    2 new line '

     

    3.5 修改行

    • 修改行命令 c 修改数据流中整行文本的内容
    • 他们不能再单个命令行上使用,必须指定是要将行插入还是附加到另一行
    • 在使用行号区间指定时,需要注意是用这一行文本替换数据流中的两行文本,而不是逐一修改这两行文本。
    • sed编辑器的模式匹配也适用

     

    3.6 转换行

    转换命令 y 是唯一可以处理单个字符的sed编辑器命令。

    格式:

    1 [address]y/inchars/outchars/
    • inchars和outchars 值一对一映射
    • inchars中的第一字符会被转换成outchars的第一字符;inchars中的第二字符会被转换成outchars的第二字符;以此列推
    • 如果inchars 和outchars的字符长度不符,就会报错
    • y命令不是所有系统的sed编辑器都存在的 

    3.7 打印数据流中的信息

    • p命令用来打印文本行, 一般与sed -n 组合使用
    • = 命令用来打印行号
    • l 命令用来列出行

     

    3.8 使用sed处理文件

    •  w 命令用来向文件写入行。
    •  r 命令允许将一个独立文件中的数据插入到数据流中

  • 相关阅读:
    怎样从server获取图片
    面经
    cordova百度导航插件使用
    swift初探(供objective c开发人员參考)
    右击菜单简单实现
    ios--计时器演示样例:一闪一闪亮晶晶(动画)
    新建cocos2d-xproject
    atititt.java定时任务框架选型Spring Quartz 注解总结
    UIViewController的生命周期及iOS程序运行顺序
    hdu 1162 Eddy&#39;s picture (Kruskal算法,prim算法,最小生成树)
  • 原文地址:https://www.cnblogs.com/yaoyaojcy/p/9266315.html
Copyright © 2011-2022 走看看