LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2210|回复: 18

用sed交换任意两行的问题

[复制链接]
发表于 2008-4-3 00:55:51 | 显示全部楼层 |阅读模式
要交换第2和第9行,可以这么作:
  1. sed -ne '2!{p;d};h;n;:1;8!{N;b1};G;h;n;p;g;p'
复制代码
这个语句有问题,它无法交换相邻的两行,比如,交换第4行和第5行,需要把上面语句中那两个行号的标志都变成4,这样会导致交换不成功,如何是好?希望以这个语句为基础修改一下,作一个万能语句(谢绝用\1和\2的作法)。
 楼主| 发表于 2008-4-3 09:31:27 | 显示全部楼层
诚邀本版几位顶级高手,springwind426、ly5066113  及其它高人来此一聚,借本题来个华山论剑。
回复 支持 反对

使用道具 举报

发表于 2008-4-5 10:57:28 | 显示全部楼层
非要单用一个sed命令来解决么?
如果分着写倒是非常简单的
比如交换第四行和第五行的内容
先输出1-3行内容 输出第5行内容 输出第四行内容 输出第六行到末尾的内容:
sed -ne '1,3p' t.txt;sed -ne '5p' t.txt ;sed -ne '4p' t.txt ;sed -ne '6,$p' t.txt
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-5 19:14:49 | 显示全部楼层
Post by knut;1834983
非要单用一个sed命令来解决么?
如果分着写倒是非常简单的
比如交换第四行和第五行的内容
先输出1-3行内容 输出第5行内容 输出第四行内容 输出第六行到末尾的内容:
sed -ne '1,3p' t.txt;sed -ne '5p' t.txt ;sed -ne '4p' t.txt ;sed -ne '6,$p' t.txt

最好用sed一次性解决,或者说它是个游戏,或者说是纯技术上的锻练,
如果要阁下这种意义上的简单,还不如用vi直接ddp一秒种完成。
回复 支持 反对

使用道具 举报

发表于 2008-4-6 08:15:27 | 显示全部楼层
Post by mascot;1835130
最好用sed一次性解决,或者说它是个游戏,或者说是纯技术上的锻练,
如果要阁下这种意义上的简单,还不如用vi直接ddp一秒种完成。


个人观点:如果可以的话,你说的的用VI的方法是最好不过了。
我的意思是如果能把问题简化了,就没有必要去弄复杂了。

我不否认做技术上锻炼的必要性,大家继续。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-6 11:14:56 | 显示全部楼层
阁下也许还没考虑到文件写入问题,你的句子无法用 -i 直接写入,如果要重定向,恐怕还要加不少字符,句子会变得相当冗长。所以说,干干净净地一次完成,-i 写入文件,才真正方便,用于shell脚本,也会使脚本变得简洁。
这个题相当难,我估计半年内没人能作出来,我暂时没空琢磨它。
回复 支持 反对

使用道具 举报

发表于 2008-4-6 12:05:51 | 显示全部楼层
修改如下:
sed -ne '4!{p;d};4!{h;n;:1;4!{N;b1};G};h;n;p;g;p'
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-6 12:30:50 | 显示全部楼层
Post by knut;1835315
修改如下:
sed -ne '4!{p;d};4!{h;n;:1;4!{N;b1};G};h;n;p;g;p'


不错,你这个管用,但能否和我那句作成一句呢?你这个只能作相邻的两行,请继续。
回复 支持 反对

使用道具 举报

发表于 2008-4-6 13:30:21 | 显示全部楼层
Post by mascot;1835323
不错,你这个管用,但能否和我那句作成一句呢?你这个只能作相邻的两行,请继续。


不相邻的也可以啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-6 23:55:20 | 显示全部楼层
明白了,精彩,实在是精彩。这么快就解决了,出乎我的意料。
回复 支持 反对

使用道具 举报

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

本版积分规则

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