String 小写+;大写+;在shell中连接字符串的单词(例如bash)
如何大写+连接字符串中的单词?String 小写+;大写+;在shell中连接字符串的单词(例如bash),string,shell,lowercase,capitalization,capitalize,bash,String,Shell,Lowercase,Capitalization,Capitalize,Bash,如何大写+连接字符串中的单词? (大写首字母和所有其他小写字母) 示例: input=“詹姆斯·邦德” output=“JamesBond”在其他帖子中,我提出了以下工作脚本: 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=${wo
(大写首字母和所有其他小写字母) 示例:
input=“詹姆斯·邦德”
output=“JamesBond”
在其他帖子中,我提出了以下工作脚本:
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
参考资料:
s="jAMeS bOnD"
awk '{for (i=1; i<=NF; i++)
printf toupper(substr($i, 1, 1)) tolower(substr($i,2)); print ""}' <<< "$s"
JamesBond
s=“詹姆斯·邦德”
awk'{for(i=1;i在版本4中提供的字符串操作:
${variable,,}
将所有字母小写
${variable^}
到每个单词的大写首字母
- 使用
${words[*]^}
而不是${words[@]^}
保存一些脚本行
以及其他改进(见他的评论):
- 变量名用小写,因为大写可能与环境变量冲突
- 为变量指定有意义的名称(例如
数组
->单词
)
- 使用
local
避免影响功能外的IFS
(一次为ENOUGHT)
- 对所有其他局部变量使用
local
(可以先声明变量,然后分配变量)
ARRAY=($LOWERCASE)
may展开(文件名)
- 暂时禁用使用
set-f
或shopt-so noglob
- 或者使用
read-ra words这里有一个bash3+
解决方案利用tr
进行案例转换(案例转换操作符(,
,^
,…)在bash
4中引入):
input=“詹姆斯·邦德”
read-ra单词很好,但是GNU Awk 3.1.7说Awk:(FILENAME=-FNR=1)致命:printf:no arguments
。我不得不下移printf
,下移到toupper…
。干杯:)不需要使用sed
命令和中间的$split
变量:将带的无引号字符串用于for
也会使用空格而不仅仅是换行符执行分词;因此,您可以只说:for word in$str;do
。无论哪种方式,都有一个陷阱:带for
的无引号字符串是根据路径名扩展,因此如果字符串包含一个glob,例如*
,则结果将是意外的。打开set-f
(shopt-so noglob
)可以解决此问题。请注意,您的解决方案需要bash 4或更高版本。+1;方便的东西;一些建议:在shell编程中不使用所有大写变量名是一种好的做法,以避免与环境变量发生冲突(尽管我不希望看到奇妙的超现实主义$LOWERCASE
go:)。使用数组=($LOWERCASE)
创建word数组有一个陷阱:字符串会进行路径名扩展,因此如果字符串包含一个glob,例如*
,则结果将是意外的。打开set-f
(shopt-so noglob
)可以解决此问题。另一个选项是使用read-a
创建数组(请参阅我的答案)。我建议在shell函数中使用局部变量,例如:local IFS='
-这还有一个额外的好处,即在离开函数时不必还原$IFS
。我感谢您致力于改进答案-这些函数非常优雅。最后一个建议:我建议将函数中的所有变量都设置为局部变量。加上一个诡辩:当第二次赋值$IFS
时重复local
是有效的,但我只在顶部声明变量一次。例如,在第二个函数中,您可以使用local words IFS=$'\t\n-\';!:*?'
(或者使用local
仅声明一次,然后再赋值),然后简单地IFS='
稍后。谢谢@mklement0:-D我刚刚应用了你最后的建议:-)我还缩短了答案;-)干杯请务必对你的答案做一些解释,而不仅仅是代码。谢谢你的反馈@AMACB我添加了一条评论。上面只是一个可以用来格式化字符串的示例。
capitalize_remove_spaces()
{
local words IFS
read -ra words <<< "${@,,}"
IFS=''
echo "${words[*]^}"
}
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
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
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