我想更改以下模式:
getFoo_Bar
为:
getFoo_bar
(注意下面的b)
既不知道foo也不知道bar,替换模式是什么?
我开始写作
sed 's/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1
但是我被困了:我想写“\ 2小写”,我该怎么做?
也许sed不适合?
答案 0 :(得分:33)
使用sed将getFoo_Bar更改为getFoo_bar:
echo "getFoo_Bar" | sed 's/^\(.\{7\}\)\(.\)\(.*\)$/\1\l\2\3/'
大写和小写字母由:
处理\U
使所有文字都为正确的大写字母。\u
只使第一个字符为右大写字母。\L
将所有文字设为右下角。\l
仅将第一个字符设为右下方。 (注意它是一个小写字母L)该示例只是一种模式匹配方法,仅基于修改单个文本块。使用该示例,getFoo_BAr转换为getFoo_bAr,请注意A未被更改。
答案 1 :(得分:25)
s/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1\L\2/g
测试:
$ echo 'getFoo_Bar' | sed -e 's/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1\L\2/g'
getFoo_bar
答案 2 :(得分:7)
有点短:
echo getFoo_Bar | sed 's/_\(.\)/_\L\1/'
答案 3 :(得分:6)
最短的我可以想出:
echo getFoo_Bar | sed 's/_./\L&/'
答案 4 :(得分:1)
你可以使用perl:
perl -pe 's/(get[A-Z][A-Za-z0-9]*)_([A-Z])/\1_\l\2/'
\ l这就是诀窍。
sed不会在匹配的组上执行大写/小写。
答案 5 :(得分:0)
答案 6 :(得分:0)
如果你想在下划线之后用小写字母写一切,那么这对你有用:
echo getFoo_Bar | gawk -F_ '{print tolower($2)}'
答案 7 :(得分:-2)
echo getFoo_Bar | sed 's/[Bb]/\L&/g'