爲了格式化的目的,我想用空格替換字符串的所有字符。如何將字符串轉換爲Bash中的所有空格?
STR="some string of unknown length"
SPC=" " <--- this is what I want
隨着this page幫助下,我能想出的最好的是:
SPC=${STR//[a-Z]/ }
但這只是取代字母,數字不或任何特殊字符。什麼是這種類型的Bash字符串替換的「任何字符」的佔位符?
爲了格式化的目的,我想用空格替換字符串的所有字符。如何將字符串轉換爲Bash中的所有空格?
STR="some string of unknown length"
SPC=" " <--- this is what I want
隨着this page幫助下,我能想出的最好的是:
SPC=${STR//[a-Z]/ }
但這只是取代字母,數字不或任何特殊字符。什麼是這種類型的Bash字符串替換的「任何字符」的佔位符?
您可以使用:
str="some string of unknown length"
spc="${str//[^[:space:]]/ }"
[^[:space:]]
將匹配任何非空格字符和空格替換它。
驗證:
echo "$str" | wc -c
30
echo "$spc" | wc -c
30
PS:你也可以這樣做:
spc="${str//?/ }"
得到只包含空格相同長度的字符串。 ?
匹配glob中的任何字符。
這是一種替代(無正則表達式/解析的話)的解決方案:
STR='some string of unknown length.' # Actually 30 chars
# Create an SCP var of the same length of STR filled with spaces (# updated implementation, thanks gniourf_gniourf)
printf -v SCP '%*s' ${#STR}
測試:
echo "${STR}" # 'some string of unknown length.'
echo "${SCP}" # ' '
echo "Length STR -> ${#STR}" # 'Length STR -> 30'
echo "Length SCP -> ${#SCP}" # 'Length SCP -> 30'
它是如何工作:
的printf
命令寫入在變量SCP
中的一個串的長度至少等於字符數STR
(${#STR}
)。
該技巧是在s
未更換,因爲${#STR}
後沒有進一步的參數。
使用例如:
printf '%*s' 3 # ' '
printf '%*s' 3 . # ' .'
printf '%*s' 3 123 # '123'
printf '%*s' 3 12345 # '12345'
而是:'printf -v scp'%* s'「$ {#str}」':沒有子殼,也沒有外部工具。 –
與這個問題無關,但這也符合POSIX標準(不管怎樣,這是一個變體,代價是單個子shell:'SPC = $(printf%$ {#STR} s)'。 – chepner
,我不明白爲什麼要這麼做_for格式目的,_因爲對於大多數格式的目的,你可以使用'printf'。例如,'str =「一些未知長度的字符串」; printf'%* s |%s \ n%s |%s \ n'「$ {#str}」「」「」hello「」$ str「」goodbye「'。 –
好點。我只是沒有意識到這一點......太依賴'echo'而不是使用'printf'。謝謝你的提示。 – dokaspar