2015-12-03 64 views
6

爲了格式化的目的,我想用空格替換字符串的所有字符。如何將字符串轉換爲Bash中的所有空格?

STR="some string of unknown length" 
SPC="        " <--- this is what I want 

隨着this page幫助下,我能想出的最好的是:

SPC=${STR//[a-Z]/ } 

但這只是取代字母,數字不或任何特殊字符。什麼是這種類型的Bash字符串替換的「任何字符」的佔位符?

+0

,我不明白爲什麼要這麼做_for格式目的,_因爲對於大多數格式的目的,你可以使用'printf'。例如,'str =「一些未知長度的字符串」; printf'%* s |%s \ n%s |%s \ n'「$ {#str}」「」「」hello「」$ str「」goodbye「'。 –

+0

好點。我只是沒有意識到這一點......太依賴'echo'而不是使用'printf'。謝謝你的提示。 – dokaspar

回答

8

您可以使用:

str="some string of unknown length" 
spc="${str//[^[:space:]]/ }" 

[^[:space:]]將匹配任何非空格字符和空格替換它。

驗證:

echo "$str" | wc -c 
30 
echo "$spc" | wc -c 
30 

PS:你也可以這樣做:

spc="${str//?/ }" 

得到只包含空格相同長度的字符串。 ?匹配glob中的任何字符。

+3

爲什麼打擾匹配的非空格字符?將空間轉換爲空間可能毫無意義,但它比正則表達式更好。 – kojiro

+2

好的我在回答里加了'「$ {str //?/}」'。 – anubhava

+1

感謝您的問號!我嘗試了一個點和一個明星... ;-) – dokaspar

3

這是一種替代(無正則表達式/解析的話)的解決方案:

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' 
+2

而是:'printf -v scp'%* s'「$ {#str}」':沒有子殼,也沒有外部工具。 –

+2

與這個問題無關,但這也符合POSIX標準(不管怎樣,這是一個變體,代價是單個子shell:'SPC = $(printf%$ {#STR} s)'。 – chepner

相關問題