Aquí hay algunos scripts de Toy Bash para jugar que muestran cómo combinar la búsqueda de expresiones regulares con la sustitución de cadenas.
strip_str.sh
#!/usr/bin/env bash
_str="${1}"
_filter="${2:-'apl'}"
echo "${_str//[${_filter}]/}"
strip_str.sh 'apple-foo bar'
# -> e-foo br
strip_str.sh 'apple-foo bar' 'a'
# -> pple-foo br
privatize_str.sh
#!/usr/bin/env bash
_str="${1}"
_filter="${2:-'apl'}"
_replace="${3:-'*'}"
echo "${_str//[${_filter}]/${_replace}}"
privatize_str.sh 'apple-foo bar'
# -> ****e-foo b*r
restricted_str.sh
#!/usr/bin/env bash
_str="${1}"
_valid="${2:-'a-z'}"
_replace="${3:-''}"
echo "${_str//[^${_valid}]/${_replace}}"
restricted_str.sh 'apple-foo bar'
# -> applefoobar
Para llevar clave
[a-z 0-9]es totalmente válido y útil, como un <search>dentro ${_var_name//<search>/<replace>}de Bash
^, dentro de este contexto, es al revés o notpara búsquedas tipo regex
- Los empotrados son generalmente más rápidos y a menudo son más concisos, especialmente cuando se cortan las tuberías innecesarias.
Si bien entiendo que printfes mejor en casi todos los casos de uso, el código anterior usa echopara no confundir demasiado lo que está sucediendo.
obfuscate_str.sh
#!/usr/bin/env bash
_str="${1}"
_start="${2:-6}"
_header="$(for i in {1..${_start}}; do echo -n '*'; done)"
echo "${_header}${_str:${_start}}"
obfuscate_str.sh 'apple-foo bar' 3
# -> ***le-foo bar