作者LPH66 ((short)(-15074))
看板RegExp
标题Re: [问题] sed 范例问题
时间Tue Mar 9 08:50:26 2010
※ 引述《dilutetarget (☑蒙提派森)》之铭言:
: ※ [本文转录自 Linux 看板]
: 作者: dilutetarget (☑蒙提派森) 看板: Linux
: 标题: [问题] sed 范例问题
: 时间: Tue Mar 9 00:24:23 2010
: 各位大大你们好啊
: 关於底下这个 sed 的范例
: 我想了好久 看着解决的方法 却是一点头绪都没有
: 可否请各位先知 可以给我一点提示或是稍微说明一下
: 谢谢大家!
: [问题]: 将全部字母大写的字改成仅是第一个字母大写:
: (范例) input: SMITH, A.J. and OTHER, A.N. and SCROOGE, E.
: output: Smith, A.J. and Other, A.N. and Scrooge, E.
: [方法]: s/\$/AaBbCcDdEdFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz/
首先它在原字串的尾巴附上 AaBb...Zz 这一串
: : again
: s/\([A-Za-z]\)\([A-Z]\)\(.*\2\(.\)\)/
\1\4\3/
先涂个色好讲解:
\1 \2 \3 \4
这个是对前有字母的大写字母
\([A-Z]\) 做以下的事:
* 找到AaBb..Zz那一串当中和它相同的字母 (
\(.*\2\(.\)\)里的
\2 做这件事)
因为
\2 前面是 .* 它会 greedily 的抓取字母 所以
\2 一定对到最後面的对应字母
* 找出对应小写字母 这由跟在
\2 後面的
\(.\) 负责 它会在 \4
* 替换成
\1\4\3 也就是把 \2 换成 \4
於是就把大写字换成小写了
至於 AaBb..Zz 这一串不会被换到
原因是这时变不出
\2 来 所以 \3 对不到
: t again
: s/AaBb.*//
最後把 AaBb..Zz 消掉
之所以这样不会消掉别的东西是因为原来的单字要有大写就一定是字首大写
所以不会出现中间大写的字 因此 AaBb.* 就一定是定位到我们加上去的字串了
--
◢ ˊ_▂▃▄▂_ˋ. ◣ ▅▅ ▅▅ ι●╮ █
▄▄▄▄▄
▍
./◤_▂▃▄▂_◥ \'▊ HARUHI █████ <■┘ ▄▄▄▄▄▄▄
▎
⊿ ◤◤◥█◥◥█Δ ISM By-gamejye ¢|\ ▌▌▌▌▌▄▌▌
▏
ζ(▏●‵◥′●▊)Ψ ▏ █
⊿Δ ▄▄▄ ▄▄▄▄
█/|▊ 〃 、 〃▋ |\ ▎ ハルヒ主义 █
▄▄▄█▄▄
◥◥|◣ ‵′ ◢/'◢◢
S.O.S 世界を大いに盛り上げるための凉宫ハルヒの団
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.28.92
1F:推 dilutetarget:谢谢您 经由您的解释 我已经懂了大致的概念 03/09 13:56
2F:→ dilutetarget:不过依照方法实做 一直没做出来 我再try看看 感谢您~ 03/09 13:57