使用sed将大写字母转换为小写字母

25

我想要改变以下模式:

getFoo_Bar

发送给:

getFoo_bar

(注意小写字母b)

如果既不知道foo也不知道bar,替换模式是什么?

我开始写

sed 's/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1

但我卡住了:我想写“\2 小写”,该怎么做?

也许 sed 不适用?

7个回答

41

使用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
在\L命令之后有没有办法使事情恢复正常? - Benjamin
7
从 http://www.gnu.org/software/sed/manual/sed.html 网站上得知:\E 的作用是停止由 \L 或者 \U 开始的大小写转换。 - Xr.
2
这是一个非常好的回答,不仅仅回答了原始问题,还提供了关于在sed中处理各种大小写转换任务的参考信息。节省了我大量的研究时间。谢谢! - rustyx
4
这让我用mac 10.8默认的sed得到了getFoo_lBar。我猜想mac不能处理\L或\l。 - Michael Chinen

26
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

1
为了扩展答案,这里是将所有字符转换为小写的通用表达式:echo getFoo_Bar | sed -e 's/\([A-Z][A-Za-z0-9]*\)/\L\1/g',它会生成 getfoo_bar - espinchi
10
请注意,此解决方案仅适用于GNU sed。 在POSIX sed中没有\l/\L/\u/\U/\E。 在这种情况下,您可以使用perl(请参见@user83591在此问题中的答案)或awk(请参见我对另一个问题的回答)。 - mschilli
@mschilli - 你是说 POSIX sed 不理解带标签的正则表达式吗?我没有它来测试 - 我有 GNU sed。如果它不理解,那就相当严重的缺陷了,不是吗? - Graham Nicholls
@GrahamNicholls: 来自 the sed manual: '最后,作为 GNU sed 的扩展,您可以包含由反斜杠和字母 L、l、U、u 或 E 组成的特殊序列。' - mschilli

8

稍微简短一些:

echo getFoo_Bar | sed 's/_\(.\)/_\L\1/'

太棒了!到处都找不到这样的东西 +1 - Fire Crow

5

我能想到的最短的翻译:

echo getFoo_Bar | sed 's/_./\L&/'

2
您可以使用Perl来完成这个任务:
perl -pe 's/(get[A-Z][A-Za-z0-9]*)_([A-Z])/\1_\l\2/'

\l在这里起着关键作用。
sed不会对匹配组进行大小写转换。

0
如果您想在下划线后面的所有内容都写成小写,那么这个方法适用于您:
echo getFoo_Bar | gawk -F_ '{print tolower($2)}'

-2
echo getFoo_Bar | sed 's/[Bb]/\L&/g'

你没有理解重点。你正在进行全局搜索/替换,而不是下划线后面的搜索/替换。 - Jon M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接