operaciones - scripts bash ejemplos
Reemplace una subcadena por otra cadena en el script de shell (6)
Es mejor usar bash que sed
si las cadenas tienen caracteres RegExp.
echo ${first_string/Suzi/$second_string}
Es portátil para Windows y funciona con al menos tan antiguo como Bash 3.1.
Para demostrar que no tienes que preocuparte mucho por escapar, vamos a cambiar esto:
/home/name/foo/bar
Dentro de esto:
~/foo/bar
Pero solo si /home/name
está en el principio. ¡No necesitamos sed
!
Dado que bash nos da las variables mágicas $PWD
y $HOME
, podemos:
echo "${PWD/#$HOME//~}"
EDIT: Gracias por Mark Haferkamp en los comentarios por la nota sobre citar / escapar ~
. *
Note cómo la variable $HOME
contiene barras diagonales, pero esto no rompió nada.
Lectura adicional: Advanced Bash-Scripting Guide .
Si usar sed
es un deber, asegúrate de escapar de todos los personajes .
Tengo "Amo a Suzi y Casarme" y quiero cambiar "Suzi" a "Sara".
#!/bin/bash
firstString="I love Suzi and Marry"
secondString="Sara"
# do something...
El resultado debe ser así:
firstString="I love Sara and Marry"
Esto se puede hacer completamente con la manipulación de cadenas bash:
first="I love Suzy and Mary"
second="Sara"
first=${first/Suzy/$second}
Eso reemplazará sólo la primera aparición; Para reemplazarlos a todos, doble la primera barra:
first="Suzy, Suzy, Suzy"
second="Sara"
first=${first//Suzy/$second}
# first is now "Sara, Sara, Sara"
Para Dash todas las publicaciones anteriores no funcionan
La solución compatible con POSIX sh
es:
result=$(echo "$firstString" | sed "s/Suzi/$secondString//")
Para reemplazar la primera aparición de un patrón con una cadena dada, use ${ parameter / pattern / string }
:
#!/bin/bash
firstString="I love Suzi and Marry"
secondString="Sara"
echo "${firstString/Suzi/$secondString}" # prints ''I love Sara and Marry''
Para reemplazar todas las ocurrencias, use ${ parameter // pattern / string }
:
message=''The secret code is 12345''
echo "${message//[0-9]/X}" # prints ''The secret code is XXXXX''
(Esto se documenta en el Manual de referencia de Bash , §3.5.3 "Expansión de parámetros de shell" .)
Tenga en cuenta que POSIX no especifica esta función, es una extensión de Bash, por lo que no todos los shells de Unix la implementan. Para obtener la documentación relevante de POSIX, consulte las Especificaciones Básicas de la Base Técnica del Grupo Abierto, Número 7 , el volumen Shell & Utilities , §2.6.2 "Expansión de Parámetros" .
Si mañana decides que no amas a Marry, ella también puede ser reemplazada:
today=$(</tmp/lovers.txt)
tomorrow="${today//Suzi/Sara}"
echo "${tomorrow//Marry/Jesica}" > /tmp/lovers.txt
Debe haber 50 formas de dejar a tu amante.
prueba esto:
sed "s/Suzi/$secondString/g" <<<"$firstString"