2015-12-03 2 views
6

Zu Formatierungszwecken möchte ich alle Zeichen eines Strings durch Leerzeichen ersetzen.Wie konvertiert man einen String in alle Leerzeichen in Bash?

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

Mit Hilfe von this page, das Beste, was ich mit ist dies einfiel:

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

Aber das ersetzt nur Buchstaben

, nicht Ziffern oder Sonderzeichen. Was ist der Platzhalter für "jedes Zeichen" mit dieser Art von Bash String Ersetzungen?

+0

Ich bin nicht ganz sicher, warum diese _for Formatierung Zwecke tun wollen, _ da für die meisten Formatierungszwecke können Sie 'printf' verwenden. Zum Beispiel "str =" eine Zeichenfolge unbekannter Länge "; printf '% * s |% s \ n% s |% s \ n' "$ {# str}" "" "hallo" "$ str" "Auf Wiedersehen" '. –

+0

Guter Punkt. Das war mir einfach nicht bewusst ... zu fest auf echo anstatt auf printf. Danke für den Tipp. – dokaspar

Antwort

8

können Sie verwenden:

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

[^[:space:]] wird jede nicht-Leerzeichen übereinstimmen und es durch den Raum zu ersetzen.

Überprüfen:

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

PS: Sie können auch tun:

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

die Zeichenfolge gleicher Länge, die nur Räume zu erhalten. ? entspricht einem beliebigen Zeichen in glob.

+3

Warum sollten nicht Leerzeichen angeglichen werden? Das Konvertieren eines Leerzeichens in ein Leerzeichen ist möglicherweise sinnlos, liest sich jedoch besser als ein Regex. – kojiro

+2

ok Ich fügte '" $ {str //? /} "' Als Antwort hinzu. – anubhava

+1

Danke für dieses Fragezeichen! Ich habe es mit einem Punkt und einem Stern versucht ... ;-) – dokaspar

3

Dies ist eine Alternative (kein regex/Parsing überhaupt) Lösung:

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} 

-Test:

echo "${STR}"     # 'some string of unknown length.' 
echo "${SCP}"     # '        ' 
echo "Length STR -> ${#STR}" # 'Length STR -> 30' 
echo "Length SCP -> ${#SCP}" # 'Length SCP -> 30' 

Wie es funktioniert:

Die printf Befehl schreibt in Variable SCP eine Zeichenfolge von mindestens der Länge gleich die Anzahl der Zeichen von STR (${#STR}).

Die Tricks sind in der s nicht ersetzt, da es nach ${#STR} keinen weiteren Parameter gibt.

Anwendungsbeispiel:

printf '%*s' 3  # ' ' 
printf '%*s' 3 .  # ' .' 
printf '%*s' 3 123 # '123' 
printf '%*s' 3 12345 # '12345' 
+2

Eher: 'printf -v scp '% * s'" $ {# str} "': keine Subshells und keine externen Tools. –

+2

Nicht relevant für die Frage, aber das ist auch POSIX-konform (na ja, eine Variante, jedenfalls auf Kosten einer einzelnen Subshell: 'SPC = $ (printf% $ {# STR} s)'. – chepner