• Linux Sed命令具体解释+怎样替换换行符" "(非常多面试问道)


    Sed
    Sed是一个强大的文本处理工具
    能够採用正则匹配。对文本进行插入删除改动等操作
    Sed处理的时候,一次处理一行,每一次把当前处理的存放在暂时缓冲区。处理完后输出缓冲区内容到屏幕,然后把下一行读入缓冲区,如此反复,直到结尾。




    1、命令格式和參数
    sed [-nefr] [动作] 文件
    參数:
    -n 安静模式。在sed处理的时候。全部来自STDIN的数据都会被输出到终端。加上-n会仅仅输出处理的哪行
    -e 直接在命令列上进行sed动作编辑
    -f 直接将sed的动作写在文件内
    -r sed动作支持延伸的正则表达(默认仅仅是基础正则)
    -i 直接改动文件内容(慎用,尤其是用系统文件做练习的时候)


    动作:
    a append:添加。在当前行的下一行添加
    c   :代替,代替n1到n2之间的行
    d delete:删除
    i 插入,眼下行的上一行插入
    p 打印。经常与-n使用
    s 代替,s/old/new/g


    2、基础使用方法具体解释
    (1)第一行之后加入一行

    [root@localhost ~]# nl file.txt | sed "1a add text"
         1  wtmp begins Mon Feb 24 14:26:08 2014
    add text
         2  192.168.0.1
         3  162.12.0.123
         4  this is the last line
    (2)第一行之前加入一行
    [root@localhost ~]# nl file.txt | sed "1i add text"
    add text
         1  wtmp begins Mon Feb 24 14:26:08 2014
         2  192.168.0.1
         3  162.12.0.123
         4  this is the last line
    (3)删除第2,3行
    [root@localhost ~]# nl file.txt | sed "2,3d"
         1  wtmp begins Mon Feb 24 14:26:08 2014
         4  this is the last line
    (4)打印第2,3行
    [root@localhost ~]# sed -n "2,3p" file.txt 
    192.168.0.1
    162.12.0.123

    这里要提到的是,尽量使用-n。不然会出现这种结果
    [root@localhost ~]# sed "2,3p" file.txt 
    wtmp begins Mon Feb 24 14:26:08 2014
    192.168.0.1
    192.168.0.1
    162.12.0.123
    162.12.0.123
    this is the last line

    (5)把168换成169
    先看源文件
    [root@localhost ~]# cat file.txt 
    wtmp begins Mon Feb 24 14:26:08 2014
    192.168.0.1
    162.12.0.123
    this is the last line
    
    处理后
    [root@localhost ~]# sed "s/168/169/g" file.txt 
    wtmp begins Mon Feb 24 14:26:08 2014
    192.169.0.1
    162.12.0.123
    this is the last line

    (6)插入多行
    [root@localhost ~]# nl file.txt | sed "2afirst
    second" file.txt 
    wtmp begins Mon Feb 24 14:26:08 2014
    192.168.0.1
    first
    second
    162.12.0.123
    this is the last line

    (7)匹配数据,然后进行操作
    仅仅须要在上述的基础上加上正则匹配
    sed "/匹配的模式/处理的方式" file.txt 
    sed "/^root/d" file.txt 对開始有root的删除
    比如
    匹配begin,并删除改行
    [root@localhost ~]# nl file.txt | sed "/begin/d"
         2  192.168.0.1
         3  162.12.0.123
         4  this is the last line
    匹配123,而且把含有123的行162都替换成172
    [root@localhost ~]# nl file.txt | sed "/123/{s/162/172/g;q}"
         1  wtmp begins Mon Feb 24 14:26:08 2014
         2  192.168.0.1
         3  172.12.0.123
         4  this is the last line
    这里大括号{}里能够运行多个命令,用;隔开就可以,q是退出
    (8)连续编辑 -e
    删除第二行,而且匹配把last替换成new
    <pre name="code" class="plain">[root@localhost ~]# nl file.txt | sed -e "2d" -e "s/last/new/"
         1  wtmp begins Mon Feb 24 14:26:08 2014
         3  162.12.0.123
         4  this is the new line
    

    
    (9)直接改动文件,切记不要改动系统文件
    [root@localhost ~]# sed -i "/begin/{s/24/25/g}" file.txt 
    [root@localhost ~]# cat file.txt 
    wtmp begins Mon Feb 25 14:26:08 2014
    192.168.0.1
    162.12.0.123
    this is the last line


    三 、一个比較有趣的样例
    怎样替换 也就是把全部的行都归为一行

    第一种方式
    [root@localhost ~]# sed ':a;N;$!ba;s/
    / /g' file.txt 
    wtmp begins Mon Feb 25 14:26:08 2014 192.168.0.1 162.12.0.123 this is the last line

    另外一种方式

    [root@localhost ~]# tr "
    " " " < file.txt 
    wtmp begins Mon Feb 25 14:26:08 2014 192.168.0.1 162.12.0.123 this is the last line last linen


  • 相关阅读:
    OpenCv 人脸识别 基础
    C++ 0x std::async 的应用
    C++ 0x 使用condition_variable 与 Mutex 同步两个线程
    Unity C# 调用 C++ DLL 并在 DLL 中调用 C# 的回调函数
    C++ 11 中的 Lambda 表达式的使用
    DirectShow 制作在Unity3D中可以设置进度的视频播放插件
    Async/Await 如何通过同步的方式实现异步
    React Native 开源项目汇总
    ES6 Promise的理解与简单实现(链接)
    深刻理解BFC(链接)
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6784447.html
Copyright © 2020-2023  润新知