免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: sabin541
打印 上一主题 下一主题

sed如何实现两行的位置交换 [复制链接]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
11 [报告]
发表于 2008-09-18 16:06 |只看该作者
上面写的是个状态机。
这个太复杂了,我写个简单易懂的

  1. sed -nr '1h;1!H;${
  2. x;s/([^\n]*music[^\n]*)\n(.*)([^\n]*realist[^\n]*)/\3\n\2\1/;te
  3. s/([^\n]*realist[^\n]*)\n(.*)([^\n]*music[^\n]*)/\3\n\2\1/;
  4. :e p;q;}'
复制代码

论坛徽章:
3
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:19
12 [报告]
发表于 2008-09-18 16:33 |只看该作者
原帖由 cjaizss 于 2008-9-18 16:06 发表
上面写的是个状态机。
这个太复杂了,我写个简单易懂的

sed -nr '1h;1!H;${
x;s/([^\n]*music[^\n]*)\n(.*)([^\n]*realist[^\n]*)/\3\n\2\1/;te
s/([^\n]*realist[^\n]*)\n(.*)([^\n]*music[^\n]*)/\3\n\ ...



cjaizss说一下你考虑问题的思路呗,让俺也学习一下

论坛徽章:
1
2015元宵节徽章
日期:2015-03-06 15:51:33
13 [报告]
发表于 2008-09-18 16:48 |只看该作者
谢谢了
看是看不懂了,慢慢看吧,从构造图灵机出发的选手就是厉害啊。
慢慢体会

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
14 [报告]
发表于 2008-09-18 17:25 |只看该作者

回复 #1 sabin541 的帖子

如果只出现一次:

  1. ed urfile &>/dev/null <<EOF
  2. /music/t/realist/
  3. /realist/m/music/
  4. -d
  5. w
  6. q
  7. EOF
复制代码

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
15 [报告]
发表于 2008-09-18 17:31 |只看该作者
原帖由 MYSQLER 于 2008-9-18 16:33 发表



cjaizss说一下你考虑问题的思路呗,让俺也学习一下

第二个的意思:
先把所有的输入都缓存;最后把music和realist调换,再输出
第一个的意思:
一开始的时候,如果没有遇到music或者realist,则把这一行输出
当遇到其中之一的时候,就开始缓存,然后遇到另外一个的时候,把缓存内容中的music和realist调换,再输出
以后则是每一行都原样输出
第一个是一个状态机:

___                  ___
|   |                |    |
|  v   music       |    |
---s------------>a<--
    |                  |
    |realist          |realist
    |                  |
    v                  v
-->b------------->e---
|    |    music     ^    |
|__|                   |__|


s
a    EOF
b  ---------->end
e

[ 本帖最后由 cjaizss 于 2008-9-18 17:36 编辑 ]

论坛徽章:
0
16 [报告]
发表于 2008-09-18 18:54 |只看该作者

  1. sed '/music/{:a;N;/reallist/!ba;s/\([^\n]*\)\n\(.*\)\n\(.*\)/\3\n\2\n\1/}' 数据文件
复制代码


解释:
/music/{....}  遇到含有music的行,开始做{}中的命令序列
:a;N;/reallist/!ba  循环读信息,直到读取到含有reallist的行
s/\([^\n]*\)\n\(.*\)\n\(.*\)/\3\n\2\n\1/  把第一行和最后一行调换

论坛徽章:
0
17 [报告]
发表于 2008-09-19 00:50 |只看该作者
原帖由 cjaizss 于 2008-9-18 16:06 发表
上面写的是个状态机。
这个太复杂了,我写个简单易懂的

sed -nr '1h;1!H;${
x;s/([^\n]*music[^\n]*)\n(.*)([^\n]*realist[^\n]*)/\3\n\2\1/;te
s/([^\n]*realist[^\n]*)\n(.*)([^\n]*music[^\n]*)/\3\n\ ...


汗,这个也算简单易懂!!!

如果LZ的文件是这样的:
test.txt
#---------------
music
realist
#---------------

要得到这样的结果吗?
#---------------
realist
music
#---------------

可以这样写: sed -n  '/^music/{h;d};/^realist/{G}'  test.txt

[ 本帖最后由 xwmhmily 于 2008-9-19 00:55 编辑 ]

论坛徽章:
1
2015元宵节徽章
日期:2015-03-06 15:51:33
18 [报告]
发表于 2008-09-19 08:17 |只看该作者
谢谢大家热情的帮助,黑哥能来真的很高兴,
大家的回复基本都是sed中比较高深的部分,刚下了sed手册,对比大家的分析,仔细琢磨一下了。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
19 [报告]
发表于 2008-09-19 09:26 |只看该作者
原帖由 xwmhmily 于 2008-9-19 00:50 发表


汗,这个也算简单易懂!!!

如果LZ的文件是这样的:
test.txt
#---------------
music
realist
#---------------

要得到这样的结果吗?
#---------------
realist
music
#---------------

可以 ...

我的程序风格虽然一般比较复杂,可我一般考虑的东西很多,也就是我会可能考虑的比较全面。
你的代码根本不是LZ所需要的,与需求不符的代码我认为是失败的

论坛徽章:
0
20 [报告]
发表于 2008-09-19 09:26 |只看该作者
原帖由 cjaizss 于 2008-9-18 15:34 发表

sed -nr '/music/{h;ba;};/realist/{h;bb;};p;d;
:a n;/realist/{p;g;s/([^\n]*)\n(.*)/\2\n\1/;p;be;};H;ba;
:b n;/music/{p;g;s/([^\n]*)\n(.*)/\2\n\1/;p;be;};H;ba;
:e n;p;be'


这个位置是不是应该是bb?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP