Как в сценарии bash очистить ввод пользователя?
-
01-07-2019 - |
Вопрос
Я ищу лучший способ сделать простой ввод:
echo -n "Enter a string here: "
read -e STRING
и очистите его, удалив небуквенно-цифровые символы, строчные буквы (регистр) и заменив пробелы подчеркиваниями.
Имеет ли значение порядок?Является tr
лучший/единственный способ сделать это?
Решение
Как указывает dj_segfault, большую часть этой работы оболочка может сделать за вас.Похоже, вам придется прибегнуть к чему-то внешнему для перевода строки в нижний регистр.Для этого у вас есть много вариантов, таких как однострочники Perl выше и т. д., но я думаю, что tr, вероятно, самый простой.
# first, strip underscores
CLEAN=${STRING//_/}
# next, replace spaces with underscores
CLEAN=${CLEAN// /_}
# now, clean out anything that's not alphanumeric or an underscore
CLEAN=${CLEAN//[^a-zA-Z0-9_]/}
# finally, lowercase with TR
CLEAN=`echo -n $CLEAN | tr A-Z a-z`
Порядок здесь несколько важен.Мы хотим избавиться от подчеркиваний, а также заменить пробелы на подчеркивания, поэтому сначала нам нужно обязательно удалить подчеркивания.Ожидая передачи данных в tr до конца, мы знаем, что у нас есть только буквенно-цифровые символы и символы подчеркивания, и мы можем быть уверены, что у нас нет пробелов, поэтому нам не нужно беспокоиться о том, что специальные символы интерпретируются оболочкой.
Другие советы
Bash может сделать все это самостоятельно, большое спасибо.Если вы посмотрите на раздел man-страницы на Расширение параметров, вы увидите, что в этом bash есть встроенные подстановки, подстроки, обрезка, rtrim и т. д.
Чтобы удалить все небуквенно-цифровые символы, выполните
CLEANSTRING=${STRING//[^a-zA-Z0-9]/}
Это Бритва Оккама.Нет необходимости запускать другой процесс.
Быстро и грязно:
STRING=`echo 'dit /ZOU/ een test123' | perl -pe's/ //g;tr/[A-Z]/[a-z]/;s/[^a-zA-Z0-9]//g'`
Вы можете запустить его через Perl.
export CLEANSTRING=$(perl -e 'print join( q//, map { s/\\s+/_/g; lc } split /[^\\s\\w]+/, \$ENV{STRING} )')
Я использую здесь подоболочку в стиле ksh, я не совсем уверен, что она работает в bash.
В оболочке хорошо то, что вы можете использовать perl, awk, sed, grep....
После небольшого осмотра кажется, tr
действительно самый простой способ:
export CLEANSTRING="`echo -n "${STRING}" | tr -cd '[:alnum:] [:space:]' | tr '[:space:]' '-' | tr '[:upper:]' '[:lower:]'`"
бритва Оккама, Я полагаю.