В скрипте bash, как мне санировать ввод пользователя? - PullRequest
42 голосов
/ 18 сентября 2008

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

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

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

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

Ответы [ 5 ]

43 голосов
/ 18 сентября 2008

Как указывает dj_segfault, оболочка может сделать большую часть этого за вас. Похоже, вам придется прибегнуть к чему-то внешнему для строчной строчки. Для этого у вас есть много вариантов, таких как perl one-liners выше и т. Д., Но я думаю, что 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 до конца, мы знаем, что у нас есть только буквенно-цифровые и подчеркивания, и мы можем быть уверены, что у нас нет пробелов, поэтому нам не нужно беспокоиться о том, что специальные символы интерпретируются оболочкой.

32 голосов
/ 18 сентября 2008

Bash может сделать все это самостоятельно, большое спасибо. Если вы посмотрите на раздел справочной страницы Расширение параметров , вы увидите, что в bash есть встроенные замены: substring, trim, rtrim и т.д.

Чтобы исключить все не алфавитно-цифровые символы, выполните

CLEANSTRING=${STRING//[^a-zA-Z0-9]/}

Это бритва Оккама. Нет необходимости запускать другой процесс.

1 голос
/ 18 сентября 2008

Быстро и грязно:

STRING=`echo 'dit /ZOU/ een test123' | perl -pe's/ /<em>/g;tr/[A-Z]/[a-z]/;s/[^a-zA-Z0-9</em>]//g'`

1 голос
/ 18 сентября 2008

Вы можете запустить его через Perl.

export CLEANSTRING=$(perl -e 'print join( q//, map { s/\\s+/_/g; lc } split /[^\\s\\w]+/, \$ENV{STRING} )')

Здесь я использую подоболочку в стиле ksh, я не совсем уверен, что она работает в bash.

Это хорошая вещь в shell, это то, что вы можете использовать perl, awk, sed, grep ....

0 голосов
/ 18 сентября 2008

После небольшого осмотра кажется, что tr действительно самый простой способ:

export CLEANSTRING="`echo -n "${STRING}" | tr -cd '[:alnum:] [:space:]' | tr '[:space:]' '-'  | tr '[:upper:]' '[:lower:]'`"

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

...