2008-09-18 4 views
41

Я ищу лучший способ взять простой вход:В сценарии bash, как я дезинфицирую пользовательский ввод?

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

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

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

ответ

41

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

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

0

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

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

Occam's razor, я полагаю.

+0

если вы установите `STRING = $ (гт/TMP/*)`, если эхо $ STRING перед очисткой, он будет выполнять подоболочку и удалить/TMP/содержание ... так что вам нужно дезинфицировать его ПЕРЕД любой эхо делается – higuita 2016-05-04 16:29:12

1

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

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

+0

я не видел свое решение, когда я пошел работать на шахту. – Axeman 2008-09-18 03:43:20

1

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

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

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

Это хорошая вещь о скорлупе, является то, что вы можете использовать Perl, AWK, Sed, Grep ....

29

Bash может сделать все это по себе, спасибо очень много. Если вы посмотрите на раздел справочной странице по параметров расширения, вы увидите, что этот удар имеет встроенные замены, подстрока, наличники, RTRIM и т.д.

Чтобы устранить все не алфавитно-цифровые символы, сделайте

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

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

+0

Хорошо, положительный ответ. Я использовал расширение параметров, даже не осознавая этого. – 2008-09-18 17:18:45

+2

Это хороший ответ для подмножества спецификаций, но он не меняет пробелы для подчеркивания. – Axeman 2008-09-18 18:55:59