Ось декілька іграшок Bash-сценаріїв, з якими можна зіграти, які показують, як поєднувати пошук, схожий на регулярні виразки, із підстановкою рядків.
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
Ключові вивезення
[a-z 0-9]є повністю дійсним і зручним, як <search>всередині ${_var_name//<search>/<replace>}Bash
^, в цьому контексті - це зворотний або not для регекс-подібних пошуків
- Вбудовані в основному більш швидкі і часто більш стислі, особливо коли вони вирізають непотрібні трубопроводи
Хоча я розумію , що printfце краще , майже у всіх випадках використання наведений вище код використовує для echoтого, щоб не занадто плутати то , що відбувається.
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