【发布时间】:2015-08-12 14:56:33
【问题描述】:
我正在尝试使用以下 sed 命令将字符串中每个单词的首字母大写,但它不起作用:
echo "my string" | sed 's/\b\(.\)/\u\1/g'
输出:
my string
我做错了什么?
谢谢
【问题讨论】:
标签: macos bash sed pipe capitalization
我正在尝试使用以下 sed 命令将字符串中每个单词的首字母大写,但它不起作用:
echo "my string" | sed 's/\b\(.\)/\u\1/g'
输出:
my string
我做错了什么?
谢谢
【问题讨论】:
标签: macos bash sed pipe capitalization
鉴于您的示例输入,这将适用于任何 awk:
$ echo 'my string' | awk '{for (i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) substr($i,2)} 1'
My String
如果这不能满足您的需求,请编辑您的问题以显示一些更具代表性的示例输入和预期输出。
【讨论】:
这是一个适用于 OSX 的 sed 解决方案:
echo 'my string
ANOTHER STRING
tHiRd StRiNg' | sed -En '
y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
:loop
h
s/^(.*[^a-zA-Z0-9])?([a-z]).*$/\2/
t next
b end
:next
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
G
s/^(.+)\n(.*[^a-zA-Z0-9])?[a-z](.*)$/\2\1\3/
t loop
:end
p
'
Output:
My String
Another String
Third String
sed 命令的工作原理如下:
以下是循环的工作原理:
执行速度测试表明,当前 sed 方法的执行速度与 Ed Morton 提交的 awk 解决方案大致相同。
【讨论】:
这个问题已经解决了:Uppercasing First Letter of Words Using SED
我在 GNU sed 上得到了正确的行为,但在 OS X 附带的标准 BSD sed 上却没有。我认为 \u “正则表达式”是 GNU 的东西。 “port install gsed”怎么样?
编辑:如果您真的想使用 BSD sed,我不推荐(因为命令变得非常难看),那么您可以执行以下操作:
sed -E "s:([^[:alnum:]_]|^)a:\1A:g; s:([^[:alnum:]_]|^)b:\1B:g; s:([^[:alnum:]_]|^)c:\1C:g; s:([^[:alnum:]_]|^)d:\1D:g; s:([^[:alnum:]_]|^)e:\1E:g; s:([^[:alnum:]_]|^)f:\1F:g; s:([^[:alnum:]_]|^)g:\1G:g; s:([^[:alnum:]_]|^)h:\1H:g; s:([^[:alnum:]_]|^)i:\1I:g; s:([^[:alnum:]_]|^)j:\1J:g; s:([^[:alnum:]_]|^)k:\1K:g; s:([^[:alnum:]_]|^)l:\1L:g; s:([^[:alnum:]_]|^)m:\1M:g; s:([^[:alnum:]_]|^)n:\1N:g; s:([^[:alnum:]_]|^)o:\1O:g; s:([^[:alnum:]_]|^)p:\1P:g; s:([^[:alnum:]_]|^)q:\1Q:g; s:([^[:alnum:]_]|^)r:\1R:g; s:([^[:alnum:]_]|^)s:\1S:g; s:([^[:alnum:]_]|^)t:\1T:g; s:([^[:alnum:]_]|^)u:\1U:g; s:([^[:alnum:]_]|^)v:\1V:g; s:([^[:alnum:]_]|^)w:\1W:g; s:([^[:alnum:]_]|^)x:\1X:g; s:([^[:alnum:]_]|^)y:\1Y:g; s:([^[:alnum:]_]|^)z:\1Z:g;"
【讨论】:
试试:
echo "my string" | sed -r 's/\b(.)/\u\1/g'
【讨论】: