zoukankan      html  css  js  c++  java
  • sed行处理详解(交换行,合并行,删除行等)

    1.合并行
    zj@zj:~/Script/blog_script$ cat test1
    1
    2
    3
    4
    合并上下两行
    zj@zj:~/Script/blog_script$ sed '$!N;s/ / /' test1
    1    2
    3    4
    合并匹配模式及其下一行
    zj@zj:~/Script/blog_script$ sed '/2/{N;s/ / /}' test1
    1
    2    3
    4
    合并所有行
    zj@zj:~/Script/blog_script$ sed ':a;N;s/ / /;ba;' test1
    1    2    3    4

    2.交换行
    2.1已知行号时交换两行
    zj@zj:~/Script/blog_script$ cat test
    baidu music so terrible so bad
    microsoft haha haha
    yahoo byebye
    google princess so good 
    这里是交换1,4行.当然你可以根据自己需要修改
    zj@zj:~/Script/blog_script$ for(( i=1;i<=4;i++ )); do  case $i in 1) sed -n 4p test;; 4) sed -n 1p test;; *) sed -n ${i}p test;; esac; done
    google princess so good 
    microsoft haha haha
    yahoo byebye
    baidu music so terrible so bad
    连续时好说:
    zj@zj:~/Script/blog_script$ sed '1{h;d};2{G}' test
    microsoft haha haha
    baidu music so terrible so bad
    yahoo byebye
    google princess so good 

    2.2不知道行号
    要交换的两行是连续行的情况下:
    zj@zj:~/Script/blog_script$ sed '/baidu/{h;d};/microsoft/{G}' test
    microsoft haha haha
    baidu music so terrible so bad
    yahoo byebye
    google princess so good
    ps:交换包含bai与microsoft的行
    两行不连续的情况:

    zj@zj:~/Script/blog_script$ sed '/baidu/{:a;N;/google/!ba;s/([^ ]*) (.*) (.*)/3 2 1/}' test
    google princess so good 
    microsoft haha haha
    yahoo byebye
    baidu music so terrible so bad
    ps:交换含有baidu与google的行

    研究了下写了个不论连续不连续的都可以的:
    zj@zj:~/Script/blog_script$ sed '/baidu/{:a;N;/microsoft/!ba;/[^ ]*baidu[^ ]* [^ ]*microsoft[^ ]*$/{s/([^ ]*baidu[^ ]*) (.*)/2 1/};s/([^ ]*) (.*) (.*)/3 2 1/}' test
    microsoft haha haha
    baidu music so terrible so bad
    yahoo byebye
    google princess so good 

    zj@zj:~/Script/blog_script$ sed '/baidu/{:a;N;/google/!ba;/[^ ]*baidu[^ ]* [^ ]*google[^ ]*$/{s/([^ ]*baidu[^ ]*) (.*)/2 1/;};s/([^ ]*) (.*) (.*)/3 2 1/}' test
    google princess so good 
    microsoft haha haha
    yahoo byebye
    baidu music so terrible so bad

    ps:上面代码
    /baidu/{....}  遇到含有baidu的行,开始做{}中的命令序列
    :a;N;/google/!ba  循环读信息,直到读取google.
    /[^ ]*baidu[^ ]* [^ ]*google[^ ]*$/这个就是说如果哦baidu与google之间只有一个 ,即这两个是连续行就:{s/([^ ]*baidu[^ ]*) (.*)/2 1/;}交换这两行

    如果不匹配上面的模式就是说不是连续行了.
    s/([^ ]*) (.*) (.*)/3 2 1/}
    而在匹配连续行的情况下是不可能匹配上面表达式的.ok~~~~

    3.忘了还有交互奇偶行
    zj@zj:~/Script/blog_script$ sed '$!N;s/([^ ]*) ([^ ]*)/2 1/' test
    microsoft haha haha
    baidu music so terrible so bad
    google princess so good 
    yahoo byebye

    4.删除行就不用说了吧
    d喽....

    5.删除空行
    sed '/^$/d' test2
    删除多个空行为一个空行
    sed '/^$/{N;/^ *$/D}' test2
  • 相关阅读:
    [转]Java中fina以及static的意义
    [转]Java中this的意义
    [转]Java中子类调用父类构造方法的问题分析
    [原创]SSH中HibernateTemplate与HibernateDaoSupport关系
    [转]No configuration found for the specified action解决办法
    [原创]MyEclipse2014全手动实现反向工程---解决手动整合ssh时发生的、在hibernate反向工程的时候找不到项目名的问题
    [转]SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
    pycharm中运行时添加配置 及pytest模式怎么修改为run模式
    字符串正则匹配替换
    PyCharm选中文件夹新建时Directory与Python package的区别
  • 原文地址:https://www.cnblogs.com/huangmr0811/p/5570935.html
Copyright © 2011-2022 走看看