我有三种类型的字符串,我想在bash脚本中大写.我认为sed/awk是我最好的选择,但我不确定.考虑到以下要求,最好的方法是什么?
单词
例如 taco -> Taco
由连字符分隔的多个单词,
例如 my-fish-tacos -> My-Fish-Tacos
由下划线分隔的多个单词,
例如 my_fish_tacos -> My_Fish_Tacos
Pau*_*ce. 30
没有必要使用捕获组(虽然&在某种程度上是一个):
echo "taco my-fish-tacos my_fish_tacos" | sed 's/[^ _-]*/\u&/g'
Run Code Online (Sandbox Code Playgroud)
输出:
Taco My-Fish-Tacos My_Fish_Tacos
Run Code Online (Sandbox Code Playgroud)
转义的小写"u"将匹配的子字符串中的下一个字符大写.
使用awk:
echo 'test' | awk '{
for ( i=1; i <= NF; i++) {
sub(".", substr(toupper($i), 1,1) , $i);
print $i;
# or
# print substr(toupper($i), 1,1) substr($i, 2);
}
}'
Run Code Online (Sandbox Code Playgroud)
请尝试以下方法:
sed 's/\([a-z]\)\([a-z]*\)/\U\1\L\2/g'
Run Code Online (Sandbox Code Playgroud)
它适用于我使用GNU sed,但我不认为BSD sed支持\U和\L.