命令:

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. MIGO 收货

    ls_code-gm_code = '01'. 01 - MB01 - Goods Receipts for Purchase Order 02 - MB31 - Goods Receipts for ...

  2. 一个小故事,玩转Python-while循环

    无论是传统编程场景还是当下火爆的人工智能应用场景,循环的应用都是必不可少的,上一篇文章中阐述了如何使用for循环来进行编程,这篇文章将会由一个小朋友经常听的故事来讲Python编程中的while循环. ...

  3. 建立本地yum仓库

    [root@ks-server ~]# cd /etc/yum.repos.d/[root@ks-server yum.repos.d]# ls CentOS-Base.repo CentOS-Med ...

  4. npm install, npm install -g, npm install --save, npm install --save-dev之间的区别

    1.npm install X 安装X到项目的node_modules文件夹 会修改package.json,在dependencies中写入依赖.(关于这一点,网上的大部分文章都是说,不会修改pac ...

  5. 攻防世界WEB新手练习

    0x01 view_source 0x02 get_post 这道题就是最基础的get和post请求的发送 flag:cyberpeace{b1e763710ff23f2acf16c2358d3132 ...

  6. IO-file 02 文件的状态

    package com.bwie.io; import java.io.File; /** * 文件状态 * 1.不存在  exists * 2.存在 *      文件:isFile *      ...

  7. 究竟什么是Java异常?

    第四阶段 IO 异常处理 没有完美的程序,所以我们需要不断地完善,考虑各种可能性,我们要将除了自己以外的任何用户或者操作者都当成傻子来考虑问题 在我们开发过程中 我们运行时常常会遇到 这样java.l ...

  8. [转帖]Linux日期和时间的那些事儿

    Linux日期和时间的那些事儿 http://embeddedlinux.org.cn/emb-linux/entry-level/201311/09-2672.html 自己还是稚嫩啊.. 除了年龄 ...

  9. 1.3.1 Lock接口及其实现

    1.锁的本质 2.Lock接口使用ReentrenLock 3.读写锁使用 4.读写锁实现 Lock接口方法 有点意思的是lockInterruptibly(), 只要没有获取到锁就会一直等待,直到某 ...

  10. 代理模式与动态代理之JDK实现和CGlib实现

    静态代理 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. 由业务实现类.业务代理类 两部分组成.业务实现类 负责实现主要的业务方法,业务代理类负责对调用的业务方法作拦截.过滤.预处理, ...