仅当子字符串的长度超过 3 个字符时,如何将其第一个字符大写

How to uppercase the first char of a substring only if it has more than 3 chars length

我需要转换这个字符串:

my name is user from here not there.

至:

My Name is User From Here not There

细节是,我需要将任何超过 3 个字符的单词的第一个字符上串。只是它。我正在尝试使用此命令但没有成功:

echo $FOO | tr '[:upper:]' '[:lower:]' | sed -e "s/\b\(.\)/\u/g"

其他的都应该是小写的。

能否请您尝试以下。

echo "my name is user from here not there." |
awk '{for(i=1;i<=NF;i++)
    if(length($i)>3){$i=toupper(substr($i,1,1)) substr($i,2)}}
    1'

结果:

my Name is User From Here not There.

使用 GNU sed,(和 bash):

F="my name is user from here not there."
sed -E 's/^./\u&/;s/([[:space:]])([[:alpha:]]{4})/\u/g' \ 
    <<< "${F,,}"

或:

sed -E 's/^./\u&/;s/(\s)(\w{4})/\u/g' <<< "${F,,}"

输出:

My Name is User From Here not There.

备注:

"${F,,}"bash case modification parameter expansion,它 returns 是 $F 的小写版本,成为 sed 的输入].

GNU sed 为常见的 regex 字符 class 提供了一些有用的 synonyms and abbreviations。字符 class [a-zA-Z0-9_] 可以缩写为 [[:alpha:]_],或者更简单的 \w.

尽管 \u 看起来像 regex 的缩写,但它不是。这是一个 "special sequence" 仅用于 substitute 命令替换文本 -- \u 表示 "turn the next character to uppercase".

& 指的是 substitute 命令中匹配的第一个 regexp。比较以下内容:

sed 's/./&/'          <<< foo  # outputs "f"
sed 's/./&/g'         <<< foo  # outputs "foo"
sed 's/./&&&&/g'      <<< foo  # outputs "ffffoooooooo"
sed 's/./\u&&&\u&/g'  <<< foo  # outputs "FffFOooOOooO"
sed 's/.*/&&&&/'      <<< foo  # outputs "foofoofoofoo"

有关详细信息,请参阅 GNU sed info pages

tr 并不是这项工作的正确工具;它根本不知道上下文。

sed 的某些变体具有 Perl 或 vi 正则表达式扩展,但这也不能真正用 sed 可移植地解决。

Perl 来拯救:

bash$ foo="my name is user from here not there."

bash$ echo "$foo" | perl -pe 's/\w{4,}/\u$&/g'
my Name is User From Here not There.

这可以满足您的实际要求,但不是您想要的。也许添加一个条件来分别将输入的第一个单词大写......或者切换到像 Lingua::EN::Titlecase.

这样的库

另请注意我们 do not use upper case for our private variables (because uppercase variables are reserved for system use) and always quote our shell strings.

这可能对你有用 (GNU sed):

sed -E 's/^\w+|\b\w{4,}\b/\u&/g' file

如果该单词出现在以单词或任何 4 个或更多字符长的单词开头的行中,则将单词的第一个字符大写