¿Cómo elimino espacios de las variables de shell?

He hecho lo siguiente en la línea de command:

$ text="name with space" $ echo $text name with space 

Estoy tratando de usar tr -d ' ' para eliminar los espacios y tener el resultado de:

 namewithspace 

He intentado algunas cosas como:

 text=echo $text | tr -d ' ' 

¡Hasta ahora no hay suerte, así que espero que la gente maravillosa pueda ayudar!

En Bash, puedes usar la manipulación de cadenas de Bash. En este caso, puedes hacer:

 > text="some text with spaces" > echo "${text// /}" sometextwithspaces 

Para get más información sobre los operadores de manipulación de cadenas, consulte http://tldp.org/LDP/abs/html/string-manipulation.html

Sin embargo, tu estrategia original también funcionaría, tu syntax está un poco desconectada:

 > text2=$(echo $text | tr -d ' ') > echo $text2 sometextwithspaces 

No necesita el command echo en absoluto, simplemente use Here String en su lugar:

 text=$(tr -d ' ' <<< "$text") 

Solo por curiosidad, verifiqué cuánto time lleva una tarea tan trivial para diferentes herramientas. Aquí están los resultados orderados de más lento a más rápido:

 abc="some text with spaces" $ time (for i in {1..1000}; do def=$(echo $abc | tr -d ' '); done) 0.76s user 1.85s system 52% cpu 4.976 total $ time (for i in {1..1000}; do def=$(awk 'gsub(" ","")' <<< $abc); done) 1.09s user 2.69s system 88% cpu 4.255 total $ time (for i in {1..1000}; do def=$(awk '$1=$1' OFS="" <<< $abc); done) 1.02s user 1.75s system 69% cpu 3.968 total $ time (for i in {1..1000}; do def=$(sed 's/ //g' <<< $abc); done) 0.85s user 1.95s system 76% cpu 3.678 total $ time (for i in {1..1000}; do def=$(tr -d ' ' <<< $abc); done) 0.73s user 2.04s system 85% cpu 3.244 total $ time (for i in {1..1000}; do def=${abc// /}; done) 0.03s user 0.00s system 59% cpu 0.046 total 

La operación de shell puro es definitivamente la más rápida, lo que no es sorprendente, pero ¡qué impresionante es que sea 100 veces más rápido que el command más lento!

Simplemente modifique su variable de text de la siguiente manera.

 text=$(echo $text | tr -d ' ') 

Sin embargo, si tenemos caracteres de control, esto podría romperse. Entonces, según la sugerencia de Kasperd, podríamos tener comillas dobles alnetworkingedor de eso. Asi que,

 text="$(echo "$text" | tr -d ' ')" 

será una mejor versión.

 $ sed 's. ..g' <<< $text namewithspace 

un caso especial cuando necesita una variable que tiene un número:

sh:

 typeset -i A=B #or typeset -i A=" 23232" 

ksh:

 typeset -n A=B #or typeset -n A=" 23232"