簡體   English   中英

小寫+大寫+連接shell中字符串的單詞(例如bash)

[英]lowercase + capitalize + concatenate words of a string in shell (e.g. bash)

如何大寫+連接字符串的單詞?
(首字母大寫,所有其他字母小寫)

例:
input = "jAMeS bOnD"
output = "JamesBond"

版本4中可用的字符串操作:

  • ${variable,,}以小寫所有字母
  • ${variable^}到每個單詞的大寫第一個字母
  • 使用${words[*]^}而不是${words[@]^}來保存一些腳本行

mklement0的其他改進(見他的評論):

  • 小寫的變量名稱,因為大寫的名稱可能與環境變量沖突
  • 為變量賦予有意義的名稱(例如ARRAY - > words
  • 使用local來避免在函數外部影響IFS (一次是enougth)
  • 對所有其他局部變量使用local (可以先聲明變量,然后再分配)
  • ARRAY=( $LOWERCASE )可能會擴展globs (文件名通配符
    • 使用set -fshopt -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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM