我想要改变以下模式:
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 没有被改变。
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
。 - espinchi\l
/\L
/\u
/\U
/\E
。 在这种情况下,您可以使用perl(请参见@user83591在此问题中的答案)或awk(请参见我对另一个问题的回答)。 - mschillised
manual:
'最后,作为 GNU sed 的扩展,您可以包含由反斜杠和字母 L、l、U、u 或 E 组成的特殊序列。' - mschilli稍微简短一些:
echo getFoo_Bar | sed 's/_\(.\)/_\L\1/'
我能想到的最短的翻译:
echo getFoo_Bar | sed 's/_./\L&/'
perl -pe 's/(get[A-Z][A-Za-z0-9]*)_([A-Z])/\1_\l\2/'
echo getFoo_Bar | gawk -F_ '{print tolower($2)}'
echo getFoo_Bar | sed 's/[Bb]/\L&/g'
\E
的作用是停止由\L
或者\U
开始的大小写转换。 - Xr.