24

我想更改以下模式:

getFoo_Bar

到:

getFoo_bar

(注意下b)

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

我开始写作

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

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

也许 sed 不适应?

4

7 回答 7

36

使用 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 没有改变。

于 2010-05-04T05:27:03.537 回答
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
于 2009-03-27T12:37:22.767 回答
8

有点短:

echo getFoo_Bar | sed 's/_\(.\)/_\L\1/'
于 2009-03-27T12:45:55.540 回答
6

我能想到的最短的:

echo getFoo_Bar | sed 's/_./\L&/'
于 2011-04-19T14:04:56.247 回答
2

您可以为此使用 perl:

perl -pe 's/(get[A-Z][A-Za-z0-9]*)_([A-Z])/\1_\l\2/'

\l 是这里的诀窍。

sed 不对匹配的组进行大写/小写。

于 2009-03-27T12:40:02.077 回答
0

如果您想在下划线之后用小写字母编写所有内容,那么这对您有用:

echo getFoo_Bar | gawk -F_ '{print tolower($2)}'
于 2013-10-26T17:00:53.700 回答
-2
echo getFoo_Bar | sed 's/[Bb]/\L&/g'
于 2012-06-13T13:36:39.540 回答