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.
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.
Respuestas:
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
! ... 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í:
tr " " .
Ejemplo:
# echo "hello world" | tr " " .
hello.world
De man tr
:
DESCRIPCIÓN
Traducir, comprimir y / o eliminar caracteres de la entrada estándar, escribiendo en la salida estándar.
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.
string='foo bar qux'
one="${string/ /.}" # sets one to 'foo.bar qux'
all="${string// /.}" # sets all to 'foo.bar.qux'
Usar sustitución de parámetros:
string=${string// /.}
Prueba esto para los caminos:
echo \"hello world\"|sed 's/ /+/g'|sed 's/+/\/g'|sed 's/\"//g'
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.
echo \"$(cygpath -u $JAVA_HOME)\"|sed 's/ /+/g'|sed 's/+/\\/g'|sed 's/\"//g'
sed
. Las citas son irrelevantes.
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).