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

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

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

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

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

5 ответов


как указывает 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`

порядок здесь несколько важных. Мы хотим избавиться от подчеркиваний, а также заменить пробелы подчеркиваниями, поэтому мы должны сначала удалить подчеркивания. Ожидание скоротать мы знаем, что у нас есть только буквенно-цифровые и подчеркивания, и мы можем быть уверены, что у нас нет пробелов, поэтому нам не нужно беспокоиться о специальных символах, интерпретируемых оболочкой.


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-стиль subshell здесь, я не совсем уверен, что он работает в bash.

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


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

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

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