Bash - Как преобразовать не буквенно-цифровой символ в «_» - PullRequest
10 голосов
/ 15 июня 2011

Я пытаюсь сохранить пользовательский ввод в переменной и очистить эту переменную, чтобы сохранить только буквенно-цифровой символ + некоторые другие (я имею в виду [a-zA-Z0-9 -_]).

Iпытался использовать это, но оно не является исчерпывающим:

SERVICE_NAME=$(echo $SERVICE_NAME | tr A-Z a-z | tr ' ' _ | tr \' _ | tr \" _)

У вас есть помощь для этого?

Ответы [ 4 ]

16 голосов
/ 15 июня 2011

Подстановка строк в Bash - это хорошо: $ {var // pat / rep}

val='Foo$%!*@BAR###baZ'
echo ${val//[^a-zA-Z_-]/_}
Foo_____BAR___baZ

Небольшое объяснение: косая черта вводит поиск / замену, немного похожий на sed (где он просто разграничивает шаблоны). Но вы используете одну косую черту для одной замены:

val='Foo$%!*@BAR###baZ'
echo ${val/[^a-zA-Z_-]/_}
Foo_%!*@BAR###baZ

Две косые черты // значит заменить все. Нечасто, но в нем есть логика, несколько косых черт, означающие многократную замену (прошу прощения за мой плохой английский).

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

11 голосов
/ 15 июня 2011
$ echo 'asd!@QCW@@D' | tr A-Z a-z | sed -e 's/[^a-zA-Z0-9\-]/_/g'
asd__qcw__d

Я бы использовал sed для этого и использовал бы оператор ^ (not) в вашем наборе допустимых символов и заменил бы все остальное подчеркиванием.Выше показан синтаксис с выводом.

И, в качестве бонуса, если вы хотите заменить серию недопустимых символов одним подчеркиванием, просто добавьте + к своему регулярному выражению (и используйте -r переключитесь на sed, чтобы использовать расширенные регулярные выражения:

$ echo 'asd!@QCW@@D' | tr A-Z a-z | sed -r 's/[^a-zA-Z0-9\-]+/_/g'
asd_qcw_d
1 голос
/ 15 июня 2011

Я полагаю, что все это можно сделать одной командой sed, например:

echo 'Foo$%!*@BAR###baZ' | sed -e 's/[A-Z]/\L&/g' -e 's/[^a-z0-9\-]/_/g'

OUTPUT

foo_____bar___baz
0 голосов
/ 16 июня 2011

путь perl:

perl -ple 's/[^\w\-]/_/g'

путь чистого взрыва

a='foo-BAR_123,.:goo'
echo ${a//[^[:alnum:]-]/_}

производит:

foo-BAR_123___goo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...