免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: __lxmxn__

[求助]用sed如何提取指定的字符到行最后面去 [复制链接]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
发表于 2007-06-11 09:25 |显示全部楼层
原帖由 hongmingjian 于 2007-6-10 23:23 发表
8楼的有一点问题(?),如“This*is*a*question*”应该转换为“This is a question ****”,注意其中question后应该有一个空格。

这里给另一个迭代的版本:

cat ufile | sed 's/\*/& /g;:a;s/\*\([^*]\)/\1*/;ta'

嗯,这个也很不错!但*一次挪动一个字符的位置效率有点低。^_^可以改成:
  1. sed 's/\*/& /g;:a;s/\*\([^*].*\)/\1*/;ta'
复制代码

论坛徽章:
0
发表于 2007-06-11 09:46 |显示全部楼层
发现原来做法两个问题。
要求替换*成空格
用 [^*].* 比原来的 [^*][^*]*
  • * 简单高效

    1. sed '
    2. :NEXT
    3.   s,\*\([^*].*\)$, \1*,
    4.   t NEXT
    5. ' urfile
    复制代码
  • 论坛徽章:
    1
    荣誉会员
日期:2011-11-23 16:44:17
    发表于 2007-06-11 09:54 |显示全部楼层
    呵呵,一般来说,不循环的解法比循环的效率要高些。
    再来 一个perl版的,效率似乎又比sed版的高一点点:
    1. perl -pe '$n=s/\*/ /g;s/$/"*"x$n/e'
    复制代码

    [ 本帖最后由 woodie 于 2007-6-11 10:17 编辑 ]

    论坛徽章:
    0
    发表于 2007-06-11 10:43 |显示全部楼层
    awk 版。try
    1. awk '{ count=gsub(/\*/, " "); printf $0; for (i = 0; i < count; i++) printf "*"; printf "\n"; }' urfile
    复制代码

    论坛徽章:
    0
    发表于 2007-06-11 10:45 |显示全部楼层
    不过也许 printf 多了效率更低
    hongmingjian 该用户已被删除
    发表于 2007-06-11 12:03 |显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽

    论坛徽章:
    1
    荣誉会员
日期:2011-11-23 16:44:17
    发表于 2007-06-11 12:10 |显示全部楼层
    原帖由 hongmingjian 于 2007-6-11 12:03 发表
    >>嗯,这个也很不错!但*一次挪动一个字符的位置效率有点低。^_^可以改成:
    还是woodie考虑周到。

    >>sed 's/\*/& /g;:a;s/\*\([^*].*\)/\1*/;ta'
    不过,其中的“.*”会不会太“贪婪”了?改 ...

    这里就是利用了sed正则的贪婪性,.*会匹配到行尾,然后星号就一次移到了行尾。^_^
    你改的也可以,不过是星号移动到了后面n个不是星号的字符后面,如果后面还有\*[^*]的话就不是一次到位了。效率虽然稍低,结果还是对的,因为还有下一次循环来继续后移。^_^


    ——————————————————
    ps:
    s/\*\([^*].*\)/\1*/中因为有[^*]存在,不会匹配到行尾的n个连续*,所以不必担心。^_^

    [ 本帖最后由 woodie 于 2007-6-11 12:24 编辑 ]

    论坛徽章:
    1
    荣誉会员
日期:2011-11-23 16:44:17
    发表于 2007-06-11 12:20 |显示全部楼层
    原帖由 awk就是awp加ak 于 2007-6-11 10:45 发表
    不过也许 printf 多了效率更低

    呵呵,awk没有x操作符,所以for循环省不了,星号多时效率会比perl低一点。
    hongmingjian 该用户已被删除
    发表于 2007-06-11 12:21 |显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽

    论坛徽章:
    1
    荣誉会员
日期:2011-11-23 16:44:17
    发表于 2007-06-11 12:28 |显示全部楼层
    原帖由 hongmingjian 于 2007-6-11 12:21 发表
    >>这里就是利用了sed正则的贪婪性,.*会匹配到行尾,然后星号就一次移到了行尾。^_^
    明白了,谢谢woodie。

    你的思路非常好,只是正则的功力稍弱一点点,多啃啃正则,水平会有飞跃。
    倚老卖老了^_^
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

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

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP