【发布时间】:2010-10-15 22:13:52
【问题描述】:
我想更改以下模式:
getFoo_Bar
到:
getFoo_bar
(注意下b)
既不知道foo也不知道bar,替换模式是什么?
我开始写了
sed 's/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1
但我卡住了:我想写“\2 小写”,我该怎么做?
也许 sed 不适应?
【问题讨论】:
我想更改以下模式:
getFoo_Bar
到:
getFoo_bar
(注意下b)
既不知道foo也不知道bar,替换模式是什么?
我开始写了
sed 's/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1
但我卡住了:我想写“\2 小写”,我该怎么做?
也许 sed 不适应?
【问题讨论】:
使用 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 没有改变。
【讨论】:
\E 停止大小写转换 \L 或 \U。
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
【讨论】:
echo getFoo_Bar | sed -e 's/\([A-Z][A-Za-z0-9]*\)/\L\1/g',产生getfoo_bar
\l/\L/\u/\U/\E。在这种情况下,您可以使用 perl(参见 @user83591's answer to this question)或 awk(参见 my answer to another question)。
sed manual: '最后,作为 GNU sed 扩展,您可以包含一个由反斜杠和其中一个字母组成的特殊序列L、l、U、u 或 E。'
略短:
echo getFoo_Bar | sed 's/_\(.\)/_\L\1/'
【讨论】:
我能想到的最短时间:
echo getFoo_Bar | sed 's/_./\L&/'
【讨论】:
你可以用 perl 来做这个:
perl -pe 's/(get[A-Z][A-Za-z0-9]*)_([A-Z])/\1_\l\2/'
\l 是这里的诀窍。
sed 不对匹配的组进行大写/小写操作。
【讨论】:
如果您想在下划线之后将所有内容都写成小写,那么这对您有用:
echo getFoo_Bar | gawk -F_ '{print tolower($2)}'
【讨论】:
echo getFoo_Bar | sed 's/[Bb]/\L&/g'
【讨论】: