zoukankan      html  css  js  c++  java
  • sed知识及常用用法梳理

    1.sed命令简介及其参数说明

      sed流编辑器,擅长对文本进行增删改查,过滤指定的字符串和取指定行,也可以在行中字符串前后插入内容,功能非常强大.

      注意:sed默认只支持基本的正则表达式,如果要想支持扩展的正则表达式,要加 转义或加 -r 参数.

      sed命令的语法及常用选项:

    sed [OPTION]... {script-only-if-no-other-script} [input-file]
          选项	      sed内置命令符	            文本文件
    
    选项 选项说明
    -n

    取消默认输出,只打印被sed处理的行;注意不能和-i参数同时使用

    (sed类似cat,不加-n会输出所有内容)

    -e 使用-e可以多次编辑,但要注意顺序会影响编辑的结果
    -r 使用此参数后,配合使用正则表达式无需转义(识别扩展正则表达式)
    -i 直接修改(替换)文本内容,不在屏幕输出显示(注意:-n和-i参数不能同时使用,同时使用会将文件内容清空)
    -i.bak 更改前先备份.bak为备份文件的后缀,后缀可以随意给

      sed的内置命令符常用于实现对文本的操作功能,如增删改查等:  

    内置命令符 说明
    a append,在指定行后添加一行或多行文本; $a 在末行添加(使用 可换行以实现多次添加)
    d delete,删除指定行(删除多行使用,逗号分隔;删除不连续行使用;分号分隔,如3d;5d)
    p print,打印匹配到的行,有时候会和-n参数配合使用
    s 用一个字符串替换另一个字符串
    g global,在行内进行全局替换
    i insert,在指定行前添加一行或者多行文本(使用 可换行以实现多次插入)

    2. sed常用用法示例 

      以下文本为测试文件. 

    [root@test ~]# cat a.txt
    101 zhangsan guangdong 333 555
    102 lisi guangxi 444 555 666
    103 wangyi hunan 111 222 333
    104 libai hubei 999 1000 777
    105 dupu beijing 11122 3333222 5555
    

    2.1 打印行p  

    [root@test ~]# sed -n '/libai/p' a.txt  #<==打印字符串所在行
    104 libai hubei 999 1000 777
    [root@test ~]# sed -n '1,2p' a.txt      #<==按照行号打印行,打印连续行,如果打印不连续的行,需使用分号;隔开,且每行都要有p(如1p;3p)
    101 zhangsan guangdong 333 555
    102 lisi guangxi 444 555 666
    [root@test ~]# ifconfig eth0|sed -nr 's/^.*net (.*)  net.*$/1/gp'   #<==c7.x中,gp配合使用,常用用法
    10.0.0.30
    [root@test ~]# ifconfig eth0|awk -F '[ ]+' 'NR==2 {print $3}'    #<==awk取法

    2.2 删除行d 

    [root@test ~]# sed '/zhangsan/d' a.txt   #<==删除包含指定字符串的所有行(缓存中删除)
    102 lisi guangxi 444 555 666
    103 wangyi hunan 111 222 333
    104 libai hubei 999 1000 777
    105 dupu beijing 11122 3333222 5555
    [root@test ~]# sed '3d' a.txt       #<==删除指定行(缓存中删除)
    101 zhangsan guangdong 333 555
    102 lisi guangxi 444 555 666
    104 libai hubei 999 1000 777
    105 dupu beijing 11122 3333222 5555
    [root@test ~]# sed '2,5d' a.txt     #<==删除2,3,4,5行,连续多行删除
    101 zhangsan guangdong 333 555
    [root@test ~]# sed -i '4d' a.txt    #<==真正删除内容
    [root@test ~]# sed '3,$d' a.txt     #<===删除第3行至末尾,剩下的都被打印显示
    101 zhangsan guangdong 333 555
    102 lisi guangxi 444 555 666
    [root@test ~]# sed '/^$/d' a.txt   #<==删除空行  

    2.3 替换字符串s,配合g可进行全局替换

    [root@test ~]# sed 's/libai/libaibai/g' a.txt  #<==全局替换单个字符串单词
    101 zhangsan guangdong 333 555
    102 lisi guangxi 444 555 666
    103 wangyi hunan 111 222 333
    104 libaibai hubei 999 1000 777
    105 dupu beijing 11122 3333222 5555
    [root@test ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config  #<==系统优化选项 
    [root@test ~]# cat b.txt            #<==如果没有g全局替换,默认是将每一行的第一个匹配的字符串替换
    1111 BBBBB CCCCC 1111
    AAAA 2222 3333 1111 DDDD 1111
    [root@test ~]# sed 's/1111/EEEE/' b.txt 
    EEEE BBBBB CCCCC 1111
    AAAA 2222 3333 EEEE DDDD 1111
    [root@test ~]# sed -n 's/^101/DDD/p' a.txt     #<==只有匹配了101并替换才会打印此行
    DDD zhangsan guangdong 333 555
    [root@test ~]# ifconfig eth0|sed -nr 's/^.*net (.*)  net.*$/1/gp'    #<==替换并打印IP地址
    10.0.0.30 

    2.4 增加/插入内容a/i 

      注意:内置命令符 a 增加内容是在行后增加行; i 插入内容是在行前;增加行时,都是在原有内容基础上增加行,增加的行替换掉原有的行.

    [root@test ~]# sed '3a 103.3 liubei sichuang 456 123 789' a.txt      #<==在指定行后增加内容
    101 zhangsan guangdong 333 555
    102 lisi guangxi 444 555 666
    103 wangyi hunan 111 222 333
    103.3 liubei sichuang 456 123 789
    104 libai hubei 999 1000 777
    105 dupu beijing 11122 3333222 5555
    
    [root@test ~]# sed -i '3a 103.3 liubei sichuang 456 123 789' a.txt   #<==真正增加内容
    [root@test ~]# sed -i.bak '3a 103.3 liubei sichuang 456 123 789' a.txt  #<==更改前先备份文件
    [root@test ~]# sed '2i 101.1 liubei sichuang 444 556 111' a.txt    #<==插入内容到第2行
    101 zhangsan guangdong 333 555
    101.1 liubei sichuang 444 556 111
    102 lisi guangxi 444 555 666
    103 wangyi hunan 111 222 333
    104 libai hubei 999 1000 777
    105 dupu beijing 11122 3333222 5555
    
    [root@test ~]# sed -i '2i 101.1 liubei sichuang 444 556 111' a.txt   #<==真正插入内容
    [root@test ~]# sed -i '$a 101.1 asdds ddd' a.txt     #<==将内容插入至文本末尾行
    [root@test ~]# sed 's/lisi/nihao &/' a.txt  #<==在指定字符串(文本中唯一)前插入内容,注意看情况是否添加空格
    101 zhangsan guangdong 333 555
    102 nihao lisi guangxi 444 555 666
    103 wangyi hunan 111 222 333
    104 libai hubei 999 1000 777
    105 dupu beijing 11122 3333222 5555
    
    [root@test ~]# sed 's/lisi/& nihao/' a.txt  #<==在指定字符串(文本中唯一)后插入内容,注意看情况是否添加空格
    101 zhangsan guangdong 333 555
    102 lisi nihao guangxi 444 555 666
    103 wangyi hunan 111 222 333
    104 libai hubei 999 1000 777
    105 dupu beijing 11122 3333222 5555
    [root@test ~]# sed 's/rhgb/& crashkernel=auto biosdevname=0 net.ifnames=0/' /etc/sysconfig/grub.bak   #<==c7.x系统优化内核实例 
    [root@test ~]# sed '3 s/wangyi/& test/' a.txt  #<==指定行号,在某个字符串后插入内容 
    [root@test ~]# sed 's/^/HEAD&/' a.txt        #<==在每行行头添加内容
    HEAD101 zhangsan guangdong 333 555
    HEAD102 lisi guangxi 444 555 666
    HEAD103 wangyi hunan 111 222 333
    HEAD104 libai hubei 999 1000 777
    HEAD105 dupu beijing 11122 3333222 5555
    [root@test ~]# sed 's/$/&HEAD/' a.txt       #<==在每行行尾添加内容
    101 zhangsan guangdong 333 555HEAD
    102 lisi guangxi 444 555 666HEAD
    103 wangyi hunan 111 222 333HEAD
    104 libai hubei 999 1000 777HEAD
    105 dupu beijing 11122 3333222 5555HEAD
    ######替换指定行内容
    [root@ceph-node1 ~]# cat a.txt
    101 zhangsan guangdong 333 555
    102 lisi guangxi 444 555 666
    103 wangyi hunan 111 222 333
    104 libai hubei 999 1000 777
    105 dupu beijing 11122 3333222 5555
    [root@ceph-node1 ~]# sed -i '/^101/c 1000000000' a.txt    #<==c表示change
    [root@ceph-node1 ~]# cat a.txt
    1000000000
    102 lisi guangxi 444 555 666
    103 wangyi hunan 111 222 333
    104 libai hubei 999 1000 777
    105 dupu beijing 11122 3333222 5555
    2.5 sed反向引用示例  
    [root@test ~]# echo {1..10}|sed -r 's#([0-9]+)#<1>#g'
    <1> <2> <3> <4> <5> <6> <7> <8> <9> <10>
    [root@test ~]# tail -5 /etc/passwd >a.txt
    [root@test ~]# cat a.txt
    tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    abrt:x:173:173::/etc/abrt:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    ntp:x:38:38::/etc/ntp:/sbin/nologin
    [root@test ~]# sed -r 's#(^.*)(:x.*:)(.*$)#1#g' a.txt
    tss
    abrt
    sshd
    postfix
    ntp
    [root@test ~]# sed -r 's#(^.*)(:x.*:)(.*$)#2#g' a.txt
    :x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:
    :x:173:173::/etc/abrt:
    :x:74:74:Privilege-separated SSH:/var/empty/sshd:
    :x:89:89::/var/spool/postfix:
    :x:38:38::/etc/ntp:
    [root@test ~]# sed -r 's#(^.*)(:x.*:)(.*$)#3#g' a.txt
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    [root@test ~]# stat /etc/hosts |sed -nr '4 s#^.*(([0-9]+)/.*$#1#gp'
    0644
    [root@localhost ~]# echo "aaa bbb" >a.txt
    [root@localhost ~]# sed -r 's#([:lower:]){3} ([:lower:]{3})#1 2#g' a.txt 
    aaa bbb
    

      

  • 相关阅读:
    TortoiseGit 连接oschina不用每次输入用户名和密码的方法
    IIS7 配置SSL 绑定主机头
    二种方法安装卸载Windows服务的命令
    System.Data.SqlClient.SqlException: 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值
    SQL Server 2008 角色
    sql2008“备份集中的数据库备份与现有的xx数据库不同”解决方法
    winform窗体间传值
    C#用到的一些代码汇总,后期再整理
    排球计分程序中英文切换
    ASP.NET MVC 排球计分程序 (八)排球计分程序的演示
  • 原文地址:https://www.cnblogs.com/blog-tim/p/11796317.html
Copyright © 2011-2022 走看看