Я думаю tr может делать то, что вы хотите.
variable=$(echo "${input}" | tr A-Z a-z | tr [:blank:] _ | tr -cd [:alnum:]_)
Пояснение:
tr A-Z a-z
- перевод букв верхнего регистра в нижний регистр.
tr [:blank:] _
- переводит пробелы в подчеркивание.
tr -cd [:alnum:]_
- Удалить все символы, которые не являются буквенно-цифровыми или подчеркиваниями.
ПРИМЕЧАНИЕ. Если вы хотите удалить подчеркивания до преобразования пробелов в подчеркивания, можно добавить tr -cd _
в начале цепочки труб.