2015-12-03 11 views
6

Per la formattazione, voglio sostituire tutti i caratteri di una stringa con spazi.Come convertire una stringa in tutti gli spazi in Bash?

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

Con l'aiuto della this page, il meglio che potevo venire in mente è questa:

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

Ma questo sostituisce solo lettere, non cifre o caratteri speciali. Qual è il segnaposto per "qualsiasi carattere" con questo tipo di sostituzioni stringa Bash?

+0

Io non sono del tutto sicuro perché si vuole fare questo scopo formattazione _per, _ dal momento che per la maggior parte degli scopi di formattazione è possibile utilizzare 'printf'. Ad esempio, 'str =" una stringa di lunghezza sconosciuta "; printf '% * s |% s \ n% s |% s \ n' "$ {# str}" "" "Ciao" "$ str" "addio" '. –

+0

Buon punto. Semplicemente non ne ero a conoscenza ... troppo bloccato su echo piuttosto che su printf. Grazie per il consiglio. – dokaspar

risposta

8

È possibile utilizzare:

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

[^[:space:]] corrisponderà qualsiasi carattere non-spazio e sostituirlo con lo spazio.

Verificare:

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

PS: È anche possibile fare:

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

per ottenere la stringa di stessa lunghezza contenente solo spazi. ? corrisponde a qualsiasi carattere in glob.

+3

Perché preoccuparsi di corrispondere ai caratteri non spaziali? Convertire uno spazio in uno spazio può essere inutile, ma si legge meglio di una regex. – kojiro

+2

ok ho aggiunto '" $ {str //? /} "' Come risposta. – anubhava

+1

Grazie per quel punto interrogativo! Ho provato con un punto e una stella ... ;-) – dokaspar

3

Questa è una (non regex parsing/affatto) soluzione alternativa:

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} 

prova:

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

Come funziona:

I printf scrive comando nella variabile SCP una stringa di almeno la lunghezza uguale a il numero di caratteri di STR (${#STR}).

I trucchi sono nel s non sostituito perché non ci sono ulteriori parametri dopo ${#STR}.

esempio Uso:

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

Piuttosto: 'printf -v scp '% * s'" $ {# str} "': nessuna subshell e nessun tool esterno. –

+2

Non pertinente alla domanda, ma questo è anche conforme a POSIX (beh, una variante, comunque, a scapito di una singola sottoshell: 'SPC = $ (printf% $ {# STR} s)'. – chepner