免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5299 | 回复: 11
打印 上一主题 下一主题

sed替换 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-26 21:00 |只看该作者 |倒序浏览
字符串操作有一个需求,示例


a b c d ea b c d ea b c d e

只使用sed操作,要求把空格替换成\t ,sed遇到第一个ea的时候自动跳出替换当遇到第二个ea的时候接着执行替换,一行有N个ea 有n行

该如何操作?

论坛徽章:
0
2 [报告]
发表于 2011-11-26 21:53 |只看该作者
本帖最后由 fhefh 于 2011-11-26 22:12 编辑

专门用sed想不到 就用sed和awk 我的答案 等待大神大神 先mark下
  1. [fhefh@localhost ~]$ cat mm
  2. a b c d ea b c d ea a b c d ea a b c d ea
  3. [fhefh@localhost ~]$ awk 'BEGIN{RS="ea";ORS="ea\n"}{if(NR%2==1) gsub(" ","\t",$0)}1' mm | sed '$d' | sed ':a;N;s/\n//g;ta'
  4. a       b       c       d       ea b c d ea     a       b       c       d       ea a b c d eaea
复制代码

论坛徽章:
0
3 [报告]
发表于 2011-11-26 22:16 |只看该作者
本帖最后由 linuxKong 于 2011-11-26 22:17 编辑

果断顶贴,等神人!

因为sed有:的功能取出双引号内的值,而注释的#行是无法进行goto的,我想是否这一点可以跨过ea呢!

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
4 [报告]
发表于 2011-11-27 01:35 |只看该作者
回复 1# linuxKong
  1. sed 's/\<ea\>/#/g;
  2. s/#[^#]*#/\n&\n/g;
  3. :a;
  4. s/^\([^#]*\) \([^#]*\)$/\1\t\2/Mg;
  5. ta;
  6. s/#\n\|\n#/ea/g'
复制代码

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
5 [报告]
发表于 2011-11-27 22:28 |只看该作者
sed -r 's/ea/\n/;s/ea/\n/
:a;s/(.*) (.*\n.*\n)/\1\t\2/;ta
:b;s/(\n.*\n.*) (.*)/\1\t\2/;tb
s/\n/ea/g' urfile

论坛徽章:
0
6 [报告]
发表于 2011-11-28 10:28 |只看该作者
  1. $ echo 'a b c d ea b c d ea b c d e'| sed 's/\(.*\)ea\([^(ea)]*\)ea\(.*\)/\1\nea\2ea\n\3/' | sed '/ea/!{s/[ ]/\t/g}' | sed ':a N;s/\n//g;ta'
  2. a       b       c       d       ea b c d ea     b       c       d       e
复制代码

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
7 [报告]
发表于 2011-11-28 16:32 |只看该作者
这可真是个大问题,前几位前辈对于一些特殊情况可能出现问题:

  1. # 4 楼
  2. [seesea@test]$ echo 'a b # c ea d ea b c # d ea b ea c d e' | sed 's/\<ea\>/#/g;s/#[^#]*#/\n&\n/g;:a;s/^\([^#]*\) \([^#]*\)$/\1\t\2/Mg;ta;s/#\n\|\n#/ea/g'
  3. a       b       ea c ea d       ea b c ea       d       ea b ea c       d       e
  4. # 5 楼
  5. [seesea@test]$ echo 'a b # c ea d ea b c # d ea b ea c d e' | sed -r 's/ea/\n/;s/ea/\n/;:a;s/(.*) (.*\n.*\n)/\1\t\2/;ta;:b;s/(\n.*\n.*) (.*)/\1\t\2/;tb;s/\n/ea/g'
  6. a       b       #       c       ea d ea b       c       #       d       ea      b       ea      c       d       e
  7. # 6 楼
  8. [seesea@test]$ echo 'a b # c ea d ea b c # d ea b ea c d e' | sed 's/\(.*\)ea\([^(ea)]*\)ea\(.*\)/\1\nea\2ea\n\3/' | sed '/ea/!{s/[ ]/\t/g}' | sed ':a N;s/\n//g;ta'
  9. a b # c ea d ea b c # d ea b ea c       d       e
复制代码
想半天也没啥办法,对于多行的文件没法处理,得一行一行的处理,如果只是一行的话,还可以用纯sed来:

  1. [seesea@test]$ echo 'a b # c ea d ea b c # d ea b ea c d e' | sed 's/ /\n/g' | sed -f ea3.txt
复制代码
对于多行的话,得一行一行的处理,还得借助 shell 来分行处理了:
  1. [seesea@test]$ IFS=\n';for i in $(cat sed.txt); do echo $i | tr " " "\n" | sed -f ea3.txt; done;
  2. a       b       c       d       ea b c d ea     b       c       d       e
  3. a       b       4343    ea c d ea       b       c       d       ea b c d e
  4. a       b       43      ea 43 ea        c       d       ea b c d ea     b       c       d       e
  5. ea a b ea       1       2       ea 3 4 ea
  6. ea 1 2
  7. [seesea@test]$ cat sed.txt
  8. a b c d ea b c d ea b c d e
  9. a b 4343 ea c d ea b c d ea b c d e
  10. a b 43 ea 43 ea c d ea b c d ea b c d e
  11. ea a b ea 1 2 ea 3 4 ea
  12. ea 1 2
  13. [seesea@test]$ cat ea3.txt
  14. s/ /\n/g
  15. /^ea$/bb
  16. :a
  17. N
  18. s/\n/\t/g
  19. /.*\tea$/bb
  20. ba
  21. :b
  22. N
  23. s/\n/ /g
  24. /.* ea$/ba
  25. bb
复制代码

论坛徽章:
0
8 [报告]
发表于 2011-11-28 17:16 |只看该作者
  1. awk 'BEGIN{FS=OFS="ea"}{for(i=1;i<=NF;i++)if(i%2==1)gsub(/ /,"\t",$i)}1' file
复制代码

论坛徽章:
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
9 [报告]
发表于 2011-11-28 18:10 |只看该作者
try:
  1. sed 's/ea/\n/;s/ea/\n/;h;s/ /\t/g;G;s/\(.*\)\(\n.*\n\)\([^\n]*\)\n.*\(\n.*\n\).*/\1\4\3/;s/\n/ea/g' urfile
复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
10 [报告]
发表于 2011-11-29 01:43 |只看该作者
本帖最后由 yinyuemi 于 2011-11-29 03:37 编辑

回复 7# seesea2517
  1. echo 'a b c d ea b c d ea b c d e
  2. a b 4343 ea c d ea b c d ea b c d e
  3. a b 43 ea 43 ea c d ea b c d ea b c d e
  4. ea a b ea 1 2 ea 3 4 ea
  5. ea 1 2' |\
  6. sed -r'
  7.    s/$/\n/;
  8.    :a;
  9.      s/(^| )(\<ea\>) /\1\n\2 /;
  10.      s/ (\<ea\>)( |$)/ \1\n\2/;
  11.    ta;
  12.    h;
  13.    :b;
  14.      s/\n.+//
  15.      /ea/!s/ /\t/g;
  16.      H;
  17.      x;
  18.      s/[^\n]*\n//;
  19.      h;
  20.      /^[^\n]+/tb;
  21.    s/\n//g
  22. '|cat -A
  23. a^Ib^Ic^Id^Iea b c d ea^Ib^Ic^Id^Ie$
  24. a^Ib^I4343^Iea c d ea^Ib^Ic^Id^Iea b c d e$
  25. a^Ib^I43^Iea 43 ea^Ic^Id^Iea b c d ea^Ib^Ic^Id^Ie$
  26. ea a b ea^I1^I2^Iea 3 4 ea$
  27. ea 1 2$
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP