命令:

sed -n 'A{h;n;B!{:a;N;C!ba;x;H;n};x;H;x};p' 文件名

解释:

A、B分别是需要交换的行,C是B-1

其中,A、B、C可以是行号,也可以通过匹配模式,如果是匹配模式,C就需要自己替换为B行的上一行,类似:

sed -n '/xxx/{h;n;/zzz/!{:a;N;/yyy/!ba;x;H;n};x;H;x};p' 文件名

将包含xxx与zzz的行交换(zzz在xxx行之后),yyy是zzz行前面的那一行。

思路:

对于交换相邻的行

sed -n 'A{h;n;x;H;x};p'

对于交换不相邻的行

sed -n 'A{h;n;:a;N;C!ba;x;H;n;x;H;x};p'

对比发现:

:a;N;C!ba;x;H;n; 这个部分是多出来的,因此用 B!{..}把这个部分包围起来。

解释:

A{...} 遇到A行开始做序列命令

h 把A行放到hold space

n 读取一行并替换当前行

:a;N;C!ba 把B行之前的所有行读到pattern space中

x 交换一下,这里hold space 中是 A+1~B-1的内容,pattern space中是A行的内容

H 把A行添加到hold space中,此时,hold space中是A+1~B-1A

n 把B行读进pattern space中

x 交换一下,此时,hold space中是B行,pattern space中是A+1~B-1A

H 把A+1~B-1A添加到hold space中,此时,hold space中是 BA+1~B-1A

x 交换一下,此时pattern space中是 BA+1~B-1A

对于相邻行的情况

B!{:a;N;C!ba;x;H;n} 这个部分将不执行,因为n后,当前行号就是B,因此这个部分跳过。

示例:

sed -n '/<module>hps-home<\/module>/{h;n;/<module>hps-framework<\/module>/!{:a;N;/<module>hps-observer<\/module>/!ba;x;H;n};x;H;x};p' pom.xml

将pom.xml中<module>hps-home</module>行(这行在前)与<module>hps-framework</module>行(这行在后)交换位置并将交换后内容打印到标准输出(屏幕)上,其中<module>hps-observer</module>行是<module>hps-framework</module>前面的那行。

如果要修改pom.xml文件,可以使用:

sed -n '/<module>hps-home<\/module>/{h;n;/<module>hps-framework<\/module>/!{:a;N;/<module>hps-observer<\/module>/!ba;x;H;n};x;H;x};p' pom.xml >a.txt

cat a.txt >pom.xml

sed交换任意两行的更多相关文章

  1. sed将上下两行并列

    #cat log5 mmmm 1234 nnnn 2344 #sed -n '{N;s/\n/\t/p}' log5 mmmm 1234 nnnn 2344

  2. 自己写一个swap函数交换任意两个相同类型元素的值 对空指针的使用 字节大小的判断(二)了解原理

    验证的代码: #include <stdio.h> int main(){ char c = 'z'; ) + (c << ) + () + 'a'; printf(" ...

  3. CodeForces 221(div 2)

    A 无trick水题... /* * Author: Plumrain * Created Time: 2013-12-24 22:26 * File Name: B.cpp */ #include ...

  4. noip2017考前整理(未完)

    快考试了,把我以前写过的题回顾一下.Noip2007 树网的核:floyd,推出性质,暴力.Noip2008 笨小猴:模拟Noip2008 火柴棒等式:枚举Noip2008 传纸条:棋盘dpNoip2 ...

  5. HDU - 2819 Swap(二分匹配)

    题意:交换任意两行或两列,使主对角线全为1. 分析: 1.主对角线都为1,可知最终,第一行与第一列匹配,第二行与第二列匹配,……. 2.根据初始给定的矩阵,若Aij = 1,则说明第i行与第j列匹配, ...

  6. CS229 斯坦福大学机器学习复习材料(数学基础) - 线性代数

    CS229 斯坦福大学机器学习复习材料(数学基础) - 线性代数 线性代数回顾与参考 1 基本概念和符号 1.1 基本符号 2 矩阵乘法 2.1 向量-向量乘法 2.2 矩阵-向量乘法 2.3 矩阵- ...

  7. CS229 机器学习课程复习材料-线性代数

    本文是斯坦福大学CS 229机器学习课程的基础材料,原始文件下载 原文作者:Zico Kolter,修改:Chuong Do, Tengyu Ma 翻译:黄海广 备注:请关注github的更新,线性代 ...

  8. Excel两行交换及两列交换,快速互换相邻表格数据的方法

    经常使用办公软件的人可能有遇到过需要将Excel相邻两行数据相互交换的情况,需要怎么弄才最方便呢?您还是像大家通常所做的那样先在Excel文件相应位置插入一个新的空白行然后在复制粘贴数据然后删除原来那 ...

  9. 交换一个数字的任意两个位置,指定K次的最值

    Anton has a positive integer n, however, it quite looks like a mess, so he wants to make it beautifu ...

随机推荐

  1. MySQL 判断数据库和数据表是否存在

    MySQL 判断数据库和数据表是否存在 如何使用SQL查询语句,判断数据库和数据表是否存在? 1.判断数据库是否存在 查询SQL如下: select * from information_schema ...

  2. 机器阅读理解综述Neural Machine Reading Comprehension Methods and Trends(略读笔记)

    标题:Neural Machine Reading Comprehension: Methods and Trends 作者:Shanshan Liu, Xin Zhang, Sheng Zhang, ...

  3. web布局收集整理

    /*样式文件*/ .fgw-right-p{ height: 38px; line-height: 38px; margin-bottom: 20px; padding-left: 24px; spa ...

  4. 关于java8中的String

    String 对象的不可变性 java8中的String只有2个属性value和hash,相关代码如下: /** The value is used for character storage. */ ...

  5. Fastjson反序列化漏洞

    payload: 1.{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":& ...

  6. Linux基础(特基本的那种)知识

    (自己的随手笔记,记得有点乱请轻喷) which:查看某个命令的完整路径df -h:查看系统磁盘情况history:查看历史输入的命令 网卡配置路径:vim /etc/sysconfig/networ ...

  7. Spring Boot 创建动态定时任务

    1,日期格式转换 //定时任务格式转换public static String convertCronTime(Date jobDate){ //https://blog.csdn.net/qq_39 ...

  8. Django 用Session和Cookie分别实现记住用户登录状态

    简介 由于http协议的请求是无状态的.故为了让用户在浏览器中再次访问该服务端时,他的登录状态能够保留(也可翻译为该用户访问这个服务端其他网页时不需再重复进行用户认证).我们可以采用Cookie或Se ...

  9. java中JDBC是什么?

    [学习笔记] JDBC是什么? JDBC即(java database connectivity数据连接).JDBC是Sun公司编的一堆类和方法,都封装在java.sql包中.你可以利用这堆类和方法来 ...

  10. 题目13 在O(1)时间删除链表节点

    ///////////////////////////////////////////////////////////////////////////////////// // 3. 题目13 在O( ...