将第一个字符转换为大写以及特殊字符分隔符

时间:2019-02-15 10:21:55

标签: bash

我想将第一个字符转换为大写字母,并且将dash(-)之后的字符需要使用bash转换为大写字母。

我可以使用-,

分割单个元素
echo "string" | tr [:lower:] [:upper:]

并加入所有,但这似乎没有效果。有没有简单的方法可以使用单行来解决这个问题?

输入字符串:

JASON-CONRAD-983636

期望的字符串:

Jason-Conrad-983636

5 个答案:

答案 0 :(得分:2)

我建议为此使用Python:

python3 -c 'import sys; print("-".join(s.capitalize() for s in sys.stdin.read().split("-")))'

用法:

capitalize() {
  python3 -c 'import sys; print("-".join(s.capitalize() for s in sys.stdin.read().split("-")))'
}

echo JASON-CONRAD-983636 | capitalize

输出:

Jason-Conrad-983636

答案 1 :(得分:2)

使用纯ALLOWED_HOSTS(v4 +),没有任何第三方工具

bash

并打印结果

str=JASON-CONRAD-983636
IFS=- read -ra raw <<<"$str"

final=()
for str in "${raw[@]}"; do 
    first=${str:0:1}
    rest=${str:1}
    final+=( "${first^^}${rest,,}" )
done

答案 2 :(得分:1)

请尝试以下操作(如果您对awk感到满意)。

var="JASON-CONRAD-983636"
echo "$var" | awk -F'-' '{for(i=1;i<=NF;i++){$i=substr($i,1,1) tolower(substr($i,2))}} 1' OFS="-"

答案 3 :(得分:1)

尽管聚会基本上结束了,请让我加入perl解决方案:

perl -pe 's/(^|-)([^-]+)/$1 . ucfirst lc $2/ge' <<<"JASON-CONRAD-983636"

使用ucfirst函数可能很狡猾:)

答案 4 :(得分:1)

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

sed 's/.*/\L&/;s/\b./\u&/g' file

小写所有内容。单词的首字母大写。

替代:

sed -E 's/\b(.)((\B.)*)/\u\1\L\2/g' file