仅当子字符串的长度超过 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" 仅用于 s
ubstitute 命令替换文本 -- \u
表示 "turn the next character to uppercase".
&
指的是 s
ubstitute 命令中匹配的第一个 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 个或更多字符长的单词开头的行中,则将单词的第一个字符大写
我需要转换这个字符串:
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" 仅用于 s
ubstitute 命令替换文本 -- \u
表示 "turn the next character to uppercase".
&
指的是 s
ubstitute 命令中匹配的第一个 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 个或更多字符长的单词开头的行中,则将单词的第一个字符大写