scripts script operaciones manejo funciones ejemplos cadenas aritmeticas bash shell

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"