Necesito poder hacer es reemplazar un espacio ( ) con un punto (
.
) en una cadena en bash.
Creo que esto sería bastante simple, pero soy nuevo, así que no puedo entender cómo modificar un ejemplo similar para este uso.
Utilice el reemplazo de la cadena de la carcasa en línea. Ejemplo:
foo=" "
# replace first blank only
bar=${foo/ /.}
# replace all blanks
bar=${foo// /.}
Consulte http://tldp.org/LDP/abs/html/string-manipulation.html para obtener más detalles.
tr
cadenas largas. En mi sistematr
supera a bash comenzando en cadenas con más de1000
caracteres. Parece que la complejidad del tiempo de bash es peor que lineal. Una pequeña prueba:x="$(tr -dc 'a-z \n' </dev/urandom | head -c1M)"; time y="$(tr ' ' \\- <<< "$x")"; time z="${x// /-}"
. Con una longitud de cadena de 1M (= 2 ^ 20)tr
tomó0.04s
y bash 5.0.11 tomó17s
. Con 2Mtr
tomó0.07s
(esperado) pero bash tomó69s
(4 veces más para el doble de la longitud de la cuerda).tr
! ... Dependiendo de la memoria disponible y los recursos de hardware ... ¡Pero tienes razón !: ¡Dependiendo del tipo de trabajo que hacer, las herramientas dedicadas son más eficientes!$'\n'
Podrías usar
tr
, así:Ejemplo:
De
man tr
:fuente
En bash, puede hacer un reemplazo de patrón en una cadena con la
${VARIABLE//PATTERN/REPLACEMENT}
construcción. Use solo/
y no//
para reemplazar solo la primera aparición. El patrón es un patrón comodín, como los globos de archivos.fuente
Prueba esto
fuente
Usar sustitución de parámetros:
fuente
Prueba esto para los caminos:
Reemplaza el espacio dentro de la cadena entre comillas dobles con una
+
canción, luego reemplaza+
signo con una barra diagonal inversa, luego elimina / reemplaza las comillas dobles.Tuve que usar esto para reemplazar los espacios en uno de mis caminos en Cygwin.
fuente
sed
. Las citas son irrelevantes.