Ось декілька іграшок 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