[英]lowercase + capitalize + concatenate words of a string in shell (e.g. bash)
如何大写+连接字符串的单词?
(首字母大写,所有其他字母小写)
例:
input = "jAMeS bOnD"
output = "JamesBond"
bash版本4中可用的字符串操作:
${variable,,}
以小写所有字母 ${variable^}
到每个单词的大写第一个字母 ${words[*]^}
而不是${words[@]^}
来保存一些脚本行 mklement0的其他改进(见他的评论):
ARRAY
- > words
) local
来避免在函数外部影响IFS
(一次是enougth) local
(可以先声明变量,然后再分配) ARRAY=( $LOWERCASE )
可能会扩展globs (文件名通配符 )
set -f
或shopt -so noglob
暂时禁用路径名扩展 read -ra words <<< "$input"
而不是words=( $input )
capitalize_remove_spaces()
{
local words IFS
read -ra words <<< "${@,,}"
IFS=''
echo "${words[*]^}"
}
如果只想保留字母数字字符,请在read -ra words
操作之前扩展IFS内置变量 :
capitalize_remove_punctuation()
{
local words IFS=$' \t\n-\'.,;!:*?' #Handle hyphenated names and punctuation
read -ra words <<< "${@,,}"
IFS=''
echo "${words[*]^}"
}
> capitalize_remove_spaces 'jAMeS bOnD'
JamesBond
> capitalize_remove_spaces 'jAMeS bOnD *'
JamesBond*
> capitalize_remove_spaces 'Jean-luc GRAND-PIERRE'
Jean-lucGrand-pierre
> capitalize_remove_punctuation 'Jean-luc GRAND-PIERRE'
JeanLucGrandPierre
> capitalize_remove_punctuation 'Jean-luc GRAND-PIERRE *'
JeanLucGrandPierre
从其他帖子中,我想出了这个工作脚本:
str="jAMeS bOnD"
res=""
split=`echo $str | sed -e 's/ /\n/g'` # Split with space as delimiter
for word in $split; do
word=${word,,} # Lowercase
word=${word^} # Uppercase first letter
res=$res$word # Concatenate result
done
echo $res
参考文献:
使用awk它有点冗长,但做的工作::
s="jAMeS bOnD"
awk '{for (i=1; i<=NF; i++)
printf toupper(substr($i, 1, 1)) tolower(substr($i,2)); print ""}' <<< "$s"
JamesBond
这里有一个bash 3+
解决方案 ,利用tr
的情况下转换(大小写转换操作符( ,
, ^
,...)中引入bash
4):
input="jAMeS bOnD"
read -ra words <<<"$input" # split input into an array of words
output="" # initialize output variable
for word in "${words[@]}"; do # loop over all words
# add capitalized 1st letter
output+="$(tr '[:lower:]' '[:upper:]' <<<"${word:0:1}")"
# add lowercase version of rest of word
output+="$(tr '[:upper:]' '[:lower:]' <<<"${word:1}")"
done
注意:
words=( $input )
将输入字符串拆分为单词数组是很诱人的,但是有一个问题:字符串受路径名扩展的影响 ,所以如果一个单词恰好是一个有效的glob(例如, *
),它将被扩展(替换为匹配的文件名),这是不希望的; 使用read -ra
创建数组避免了这个问题( -a
读入数组, -r
关闭输入中的\\
chars。的解释)。 echo -e '\n' "!!!!! PERMISSION to WRITE in /var/log/ DENIED !!!!!"
echo -e '\n'
echo "Do you want to continue?"
echo -e '\n' "Yes or No"
read -p "Please Respond_: " Response #get input from keyboard "yes/no"
#Capitalizing 'yes/no' with # echo $Response | awk '{print toupper($0)}' or echo $Response | tr [a-z] [A-Z]
answer=$(echo $Response | awk '{print toupper($0)}')
case $answer in
NO)
echo -e '\n' "Quitting..."
exit 1
;;
YES)
echo -e '\n' "Proceeding..."
;;
esac
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.