一段 sed 脚本,求注释。。

2014-12-08 16:54:28 +08:00
 Ansen

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

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

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

原文链接

2451 次点击
所在节点    Linux
5 条回复
yanze0613
2014-12-08 17:32:29 +08:00
:a好像和模式空间之类的有关系,高阶应用的感觉
jason52
2014-12-08 17:35:04 +08:00
a 是个标记,goto时代的产物。 t和b 好像是类似于 break continue关系,这样让sed就带有条件判断功能了。
goool
2014-12-08 17:43:23 +08:00
说真的,我认为只有非常非常必要的时候,才有必要弄清楚这些东西。
Ansen
2014-12-08 17:44:32 +08:00
@goool 是的,只是想了解一下
rrfeng
2014-12-08 18:30:39 +08:00
每行之后添加一个换行和 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.*

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/152395

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX