2013-10-29 22 views

risposta

17

si potrebbe provare la seguente:

str="${str// /_}" 
3

Con sed leggere direttamente da una variabile:

$ sed 's/ /_/g' <<< "$a" 
hello_world 

E per memorizzare il risultato è necessario utilizzare la var=$(command) sintassi:

a=$(sed 's/ /_/g' <<< "$a") 

Per completezza, con awk si può fare in questo modo:

$ a="hello my name is" 
$ awk 'BEGIN{OFS="_"} {for (i=1; i<NF; i++) printf "%s%s",$i,OFS; printf "%s\n", $NF}' <<< "$a" 
hello_my_name_is 
+0

Nessuno di questi sembra occuparsi di più di uno spazio. –

+0

@WilliamHay hai ragione, non hai controllato con più di uno spazio. Aggiornato per usare 'sed .../g', come predefinito lo faceva solo una volta. – fedorqui

+0

@fedorqui +1 per far conoscere l'utilizzo della variabile diretta senza echo piping su sed. Non vedo un aiuto diretto per questo: '<<<'. Dove è definito nelle pagine man. Potresti per favore indicarmi? – user1587504

5
$ a="hello world" 
$ echo ${a// /_} 
hello_world 

Secondo bash (1):

${parameter/pattern/string} 

Sostituzione del modello. Il modello è espanso per produrre un modello proprio come nell'espansione del percorso. Il parametro viene espanso e la corrispondenza più lunga del pattern rispetto al suo valore viene sostituita con una stringa. Se il motivo inizia con /, tutte le corrispondenze di motivo vengono sostituite con
con stringa. Normalmente viene sostituita solo la prima partita. Se il modello inizia con #, deve corrispondere all'inizio del valore espanso del parametro . Se il modello inizia con%, deve corrispondere a alla fine del valore espanso del parametro. Se stringa è nullo, le corrispondenze di motivo vengono eliminate e il modello/seguente può essere omesso . Se il parametro è @ o *, l'operazione di sostituzione è applicata a ciascun parametro posizionale a turno e l'espansione è l'elenco risultante . Se parametro è una variabile di matrice con @ o *, l'operazione di sostituzione viene applicata a ciascun membro di la matrice a sua volta e l'espansione è la lista risultante.

8

Pure bash:

a="hello world" 
echo "${a// /_}" 

O tr:

tr -s ' ' '_' <<< "$a" 
+1

+1 per pura sintassi bash !. Vorrei sapere cosa sta facendo dietro le scene. Sembra che stia facendo operazioni di sostituzione "sed". Qualunque stato manuale di bash per l'utilizzo di tale sintassi ?. – user1587504

+1

@ user1587504: Credo che 'falsetru' abbia aggiunto una sezione man relativa per questa' Sostituzione del modello '. – anubhava

Problemi correlati