zoukankan      html  css  js  c++  java
  • Linux三剑客-SED

    1、Sed是什么

    Sed:字符流编辑器,Stream Editor

    2、Sed功能与版本

    处理日志文件,日志,配置文件等

    增加、删除、修改、查询

    sed --version 可以通过man sed 来检验系统中有没有安装sed

    [root@luffy-001 ~]# sed --version
    GNU sed version 4.2.1
    Copyright (C) 2009 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
    to the extent permitted by law.
    
    GNU sed home page: <http://www.gnu.org/software/sed/>.
    General help using GNU software: <http://www.gnu.org/gethelp/>.
    E-mail bug reports to: <bug-gnu-utils@gnu.org>.
    Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.

    3、语法格式

    sed  [选项]  [sed指令]  [输入文件]

    sed   -i.bak ‘s#oldboy#oldgirl#g’  oldboy.txt

    -i  --sed命令的参数

    s  --sed命令/指令

    g  ------小尾巴/修饰

    4、命令执行流程

    模式空间:sed从文件读取一行文本后存入缓存区(这个缓存区在内存中)

    5、常用功能

    查询

    创建测试文件

    cat>person.txt<<EOF
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    EOF

    按行查询

    -n 取消默认输出

    # #1、显示某一行,单行
    [root@luffy-001 oldboy]# sed -n '1p' person.txt 
    101,oldboy,CEO
    # #如果没有‘1p’,默认会显示所有内容
    # #2、显示连续多行
    [root@luffy-001 oldboy]# sed -n '2,4p' person.txt 
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    # #3、显示包含oldboy的行到包含104的行
    # #先看包含oldboy的行,记住要使用斜线//包起来
    [root@luffy-001 oldboy]# sed -n '/oldboy/p' person.txt 
    101,oldboy,CEO
    # #显示包含oldboy的行到以104开头的行(只用了特殊符号)
    [root@luffy-001 oldboy]# sed -n '/oldboy/,/^104/p' person.txt 
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    [root@luffy-001 oldboy]#
    # #4、 查询制定更多行,通过分号隔开
    [root@luffy-001 oldboy]# sed -n '2p;4p' person.txt 
    102,zhangyao,CTO
    104,yy,CFO

    过滤多个字符

    -r  sed选项,支持扩展正则表达式(|、()),默认情况,sed只支持基本正则表达式

    sed里面的正则字符左右必须要用“/”。

    sed命令通过正则表达式进行过滤========相当于egrep

    [root@luffy-001 oldboy]# egrep 'oldboy|yy' person.txt 
    101,oldboy,CEO
    104,yy,CFO
    
    [root@luffy-001 oldboy]# sed -rn '/oldboy|yy/p' person.txt 
    101,oldboy,CEO
    104,yy,CFO

    增加

    单行增加

    a   追加append,在指定行后面添加一行或者多行文本

    i    插入insert,在指定行前面添加一行或者多行文本

    # 在第三行后面增加
    [root@luffy-001 oldboy]# sed '3a 103.5,Lee,UFO' person.txt  
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    103.5,Lee,UFO
    104,yy,CFO
    105,feixue,CIO
    # 在第三行前面增加
    [root@luffy-001 oldboy]# sed '3i 103.5,Lee,UFO' person.txt  
    101,oldboy,CEO
    102,zhangyao,CTO
    103.5,Lee,UFO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    # 查看文件并没有被修改
    [root@luffy-001 oldboy]# cat person.txt 
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    # $表示最后一行
    [root@luffy-001 oldboy]# sed -n '$p' person.txt 
    105,feixue,CIO
    # 在最后一行加入一行内容new、new、new
    [root@luffy-001 oldboy]# sed '$a new,new,new' person.txt 
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    new,new,new
    # echo >> 也可以在文件最后追加单行

    多行增加

    # 在最后加上多行(不常用,有其他方法)
    [root@luffy-001 oldboy]# sed '$a new,new,new
    old,old,old,old
    www' person.txt 
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    new,new,new
    old,old,old,old
    www
    # 使用cat命令向文件追加多行
    cat >>person.txt<<EOF
    new,new,new
    old,old,old,old
    www
    EOF

    删除

    单行删除

    [root@luffy-001 oldboy]# sed '$d' person.txt 
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    

    多行删除

    [root@luffy-001 oldboy]# sed '2,3d' person.txt 
    101,oldboy,CEO
    104,yy,CFO
    105,feixue,CIO
    [root@luffy-001 oldboy]# sed '1,4d' person.txt 
    105,feixue,CIO

    不显示文件中的空行

    [root@luffy-001 oldboy]# cat -n person.txt 
         1    101,oldboy,CEO
         2    
         3    102,zhangyao,CTO
         4    103,Alex,COO
         5    
         6    104,yy,CFO
         7    
         8    105,feixue,CIO
    [root@luffy-001 oldboy]# cat -nA person.txt 
         1    101,oldboy,CEO$
         2    $
         3    102,zhangyao,CTO$
         4    103,Alex,COO$
         5    $
         6    104,yy,CFO$
         7    $
         8    105,feixue,CIO$
    [root@luffy-001 oldboy]# grep -v '^$' person.txt   使用grep,去反
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    [root@luffy-001 oldboy]# sed '/^$/d' person.txt    使用sed(正则)删除空行
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    [root@luffy-001 oldboy]# sed -n '/^$/!p' person.txt   ! 表示去反
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    [root@luffy-001 oldboy]# sed '$d' person.txt     删除最后一行
    101,oldboy,CEO
    
    102,zhangyao,CTO
    103,Alex,COO
    
    104,yy,CFO
    
    [root@luffy-001 oldboy]# sed '$!d' person.txt   删除不是最后一行的所有行
    105,feixue,CIO
    [root@luffy-001 oldboy]# 

    替换

    sed  -i   ‘s###g’   person.txt

    -i 修改文件   -i.ori 表示自动备份(先备份在修改)

    s 单独使用---->  将每一行匹配的字符进行替换

    g 每一行全部替换----> sed指令s的替换标志之一(全局替换)

    如何用sed进行变量替换

    ###将变量中的内容进行替换(只要考察单双引号的区别)
    #设置变量
    [root@luffy-001 oldboy]# x=oldboy
    [root@luffy-001 oldboy]# y=oldgirl
    [root@luffy-001 oldboy]# 
    #替换 使用 符号$
    [root@luffy-001 oldboy]# sed 's#$x#$y#g' person.txt 
    101,oldboy,CEO
    
    102,zhangyao,CTO
    103,Alex,COO
    
    104,yy,CFO
    
    105,feixue,CIO
    #必须要使用双引号
    [root@luffy-001 oldboy]# sed "s#$x#$y#g" person.txt 
    101,oldgirl,CEO
    
    102,zhangyao,CTO
    103,Alex,COO
    
    104,yy,CFO
    
    105,feixue,CIO

    单引号:所见即所得

    双引号:与单引号类似,特殊符号会被解析 $  $()  `` !

    反向引用

    ()的功能可以记住正则表达式的一部分

    扩展正则,使用 -r

    1 应用第一个小括号中的匹配内容,2引用第二个小括号中的内容,sed最多可以记住9个

    题目:ehco "i am oldboy teacher" 如果想保留这一行的单词oldboy

    扩展

    特殊符号 = 获取行号

    [root@luffy-001 oldboy]# sed = person.txt 
    1
    101,oldboy,CEO
    2
    
    3
    102,zhangyao,CTO
    4
    103,Alex,COO
    5
    
    6
    104,yy,CFO
    7
    
    8
    105,feixue,CIO

    一条sed 语句至此那个多条命令

    每个 -e 选项后可以接一个sed指令

    分号的使用

    案例:一个文件100行,把5,35,70行单独拿出来

  • 相关阅读:
    RDIFramework.NET开发实例━表约束条件权限的使用-WinForm
    RDIFramework.NET V2.8版本 ━ 开发实例之产品管理(WinForm)
    RDIFramework.NET ━ Web中打印的各种方案参考-欢迎补充
    RDIFramework.NET 框架兼容各种数据库类型事务使用范例参考
    【干货】再上数据分页控件 ━ 更加灵活,更加实用-提供源码
    RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本━新增岗位管理-Web部分
    RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本━新增岗位管理-WinForm部分
    RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本发布
    Javascript中的apply与call详解
    Javascript定义类(class)的三种方法
  • 原文地址:https://www.cnblogs.com/yxiaodao/p/10395917.html
Copyright © 2011-2022 走看看