LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: mascot

用sed交换任意两行的问题

[复制链接]
 楼主| 发表于 2008-4-7 15:07:20 | 显示全部楼层
我替knut解释一下基本用法:
  1. sed -ne '4!{p;d};4!{h;n;:1;4!{N;b1};G};h;n;p;g;p'
复制代码

这三个4是行数位置的输入,第一个是前一个交换行的行数,后面两个是下一个交换行的行数减1。
回复 支持 反对

使用道具 举报

发表于 2008-4-7 15:53:07 | 显示全部楼层
“谢绝用\1和\2的作法”,为什么呢?

sed '2{:a;N;9{s/\(^[^\n]*\)\(.*\)\(\n\)\([^\n]*$\)/\4\2\3\1/;t};ba}'
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-7 18:13:54 | 显示全部楼层
Post by ly5066113;1835818
“谢绝用\1和\2的作法”,为什么呢?

sed '2{:a;N;9{s/\(^[^\n]*\)\(.*\)\(\n\)\([^\n]*$\)/\4\2\3\1/;t};ba}'


您这个作得确实漂亮,我的原意是希望把我拿出的那一句作得完美一些,这个目的由knut的帮助已经达到了,您这个也堪称精品。
回复 支持 反对

使用道具 举报

发表于 2008-4-7 20:48:50 | 显示全部楼层
  1. sed -n 'A{h;n;B!{:a;N;C!ba;x;H;n};x;H;x};p' 文件
复制代码

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

思路:
对于交换相邻的行
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,因此这个部分跳过。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-7 23:21:33 | 显示全部楼层
springwind426:您这个自成一家,思路焕然一新,让人大开眼界,除此之外,在此还要感谢您的详细解释。
我主持的首轮华山论剑十分成功,东邪西毒南帝北丐全都到齐,纷纷展示强劲功力,大家一致推举springwind426为武林盟主。
回复 支持 反对

使用道具 举报

发表于 2008-4-15 09:27:15 | 显示全部楼层
修正一下代码,原来的代码在相差2的时候会出错
  1. sed -n 'A{h;n;B!{:a;C!{N;ba};x;H;n};G};p' 文件
复制代码

经一位朋友提醒,用G来代替x;H;x
回复 支持 反对

使用道具 举报

发表于 2008-4-15 09:33:33 | 显示全部楼层
修正一下代码,原来的代码在相差2的时候会出错


  1. sed -n 'A{h;n;B!{:a;C!{N;ba};x;H;n};G};p' 文件
复制代码


经一位朋友提醒,用G来代替x;H;x
回复 支持 反对

使用道具 举报

发表于 2008-4-15 23:50:43 | 显示全部楼层
大牛人呀, 滔滔江水~~~~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-18 00:38:28 | 显示全部楼层
Post by springwind426;1838339
修正一下代码,原来的代码在相差2的时候会出错


  1. sed -n 'A{h;n;B!{:a;C!{N;ba};x;H;n};G};p' 文件
复制代码


经一位朋友提醒,用G来代替x;H;x


很好,修正一个BUG。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表