Подтвердить что ты не робот

В bash script, как я дезинфицирую пользовательский ввод?

Я ищу лучший способ сделать простой ввод:

echo -n "Enter a string here: "
read -e STRING

и очистите его, удалив не буквенно-цифровые символы, нижний (регистр) и заменив пробелы символами подчеркивания.

Имеет ли значение вопрос? tr лучший/единственный способ сделать это?

4b9b3361

Ответ 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:]'`"

бритва Оккама, я полагаю.