最近重拾 Shell
在CU上看到这个题目。。
只看懂了前两行。。
#!/bin/sed -f
s/$/\naAbBbCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ/
:a
s/\b\([a-z]\)\(.*\n.*\)\1\(.\)/\3\2\1\3/
ta
s/\n.*//
1
yanze0613 2014-12-08 17:32:29 +08:00 1
:a好像和模式空间之类的有关系,高阶应用的感觉
|
2
jason52 2014-12-08 17:35:04 +08:00 1
a 是个标记,goto时代的产物。 t和b 好像是类似于 break continue关系,这样让sed就带有条件判断功能了。
|
3
goool 2014-12-08 17:43:23 +08:00 1
说真的,我认为只有非常非常必要的时候,才有必要弄清楚这些东西。
|
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.* |