Вопрос

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

В оболочке хорошо то, что вы можете использовать perl, awk, sed, grep....

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top