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