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 not
para 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 printf
es mejor en casi todos los casos de uso, el código anterior usa echo
para 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