V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Ansen
V2EX  ›  Linux

一段 sed 脚本,求注释。。

  •  1
     
  •   Ansen · 2014-12-08 16:54:28 +08:00 · 2527 次点击
    这是一个创建于 3642 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近重拾 Shell
    在CU上看到这个题目。。
    只看懂了前两行。。

    将数据文件中的每个词的第一个字母变成大写.

    #!/bin/sed -f
    s/$/\naAbBbCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ/
    :a
    s/\b\([a-z]\)\(.*\n.*\)\1\(.\)/\3\2\1\3/                                       
    ta
    s/\n.*//
    

    原文链接

    5 条回复    2014-12-08 18:30:39 +08:00
    yanze0613
        1
    yanze0613  
       2014-12-08 17:32:29 +08:00   ❤️ 1
    :a好像和模式空间之类的有关系,高阶应用的感觉
    jason52
        2
    jason52  
       2014-12-08 17:35:04 +08:00   ❤️ 1
    a 是个标记,goto时代的产物。 t和b 好像是类似于 break continue关系,这样让sed就带有条件判断功能了。
    goool
        3
    goool  
       2014-12-08 17:43:23 +08:00   ❤️ 1
    说真的,我认为只有非常非常必要的时候,才有必要弄清楚这些东西。
    Ansen
        4
    Ansen  
    OP
       2014-12-08 17:44:32 +08:00
    @goool 是的,只是想了解一下
    rrfeng
        5
    rrfeng  
       2014-12-08 18:30:39 +08:00   ❤️ 2
    每行之后添加一个换行和 aAbB.....
    锚点
    匹配:单词边界 + ([a-z]一个) + (任意字符\n任意字符) + \1 + (任意字符一个)
    ---------
    比如这一行:abc def
    此时匹配的是

    (c)bc def\n
    aAbB(c)(C)

    \1 是 c ,\2 是 bc def\naAbB, \3 是 C

    ---------
    替换为: \3\2\1\3
    ---------
    替换后的结果是
    Cbc def\naAbBcC
    ---------
    如果替换成功,goto 锚点(重复替换)
    ---------
    因为\1 只匹配小写,所以循环之后就把一行内的全部 小写开头变大写了……
    ---------
    删除全部的 \n.*
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1105 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 22:52 · PVG 06:52 · LAX 14:52 · JFK 17:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.