Строка Bash заменяет несколько символов одним

Что Вы описали,

это действует как интерфейс между конечным пользователем и базовым диспетчером пакетов низкого рычага

немного походит на PackageKit мне, то есть,

PackageKit является системой, разработанной для создания установки и обновления программного обеспечения на компьютере легче. Основная цель дизайна состоит в том, чтобы объединить все программное обеспечение графические инструменты, используемые в различных дистрибутивах, и использовать часть новейшей технологии как PolicyKit, чтобы заставить процесс высосать меньше.

Править: Посмотрите здесь для списка поддерживаемых бэкендов. Edit2: Удаленный бесполезный комментарий.

8
01.11.2011, 23:17
3 ответа

Вам нужно что-то более мощное, чем традиционные подстановочные знаки оболочки. В ударе, набор extglob опция, которая предоставляет Вам доступ к регулярным выражениям в шаблонах шарика через необычный синтаксис, наследованный от ksh.

shopt -s extglob
sanitized=${raw//+([^A-Za-z0-9])/-}
8
27.01.2020, 20:09
  • 1
    Спасибо, был комментарий от освобожденного в соответствии с ответом jw013 с этим решением. Некоторая информация о совместимости с другими оболочками этого синтаксиса? Я не обеспокоен этим так очень, только для знания больше о shopt и который окружает, поддерживают его. –  neurino 01.11.2011, 13:41
  • 2
    @neurino shopt характерно для удара. Синтаксис шаблона, который это включает, всегда доступен во всех ksh вариантах. В zsh с этим синтаксисом нужно включить setopt ksh_glob. POSIX не имеет такой функции, ее подстановочные знаки менее мощны, чем regexps. Оболочки кроме bash/ksh/zsh, который на практике главным образом означает пепел в наше время, имеют тенденцию придерживаться подстановочных знаков POSIX. –  Gilles 'SO- stop being evil' 01.11.2011, 15:53
  • 3
    хорошо, в этой точке я предпочитаю больше совместимости и гибкости с немного больше служебным: echo "$t" | sed -r 's/[^[:alnum:]]+/-/g; s/^-|-$//'. Я принимаю Ваш ответ, поскольку он точно делает то, что спросило рассматриваемый. –  neurino 01.11.2011, 22:44
  • 4
    @neurino, Если Вы хотите мобильность к другим оболочкам, затем можно пойти с ответом glenn jackman. Между прочим, обратите внимание что ${var/PATTERN/REPLACEMENT} конструкция также характерна для ksh/bash/zsh. –  Gilles 'SO- stop being evil' 01.11.2011, 23:07
  • 5
    я предпочитаю sed поскольку я знаю лучше его синтаксис и поведение, я могу легко добавить оператор для удаления запускающих/запаздывающих тире, я не должен заботиться о \n символ. sed путь, менее доступный, чем tr? –  neurino 01.11.2011, 23:12

tr хороший инструмент для этого задания

new=$( printf "%s" "$t" | tr -cs 'a-zA-Z0-9' '-' )
new=${new#-}; new=${new%-}
6
27.01.2020, 20:09
  • 1
    Спасибо, +1, я никогда не вспоминаю о tr... Однако я пытался сделать его в Bash, иначе я пойду с sed: echo "$t" | sed -r 's/[^A-Za-z0-9]+/-/g' –  neurino 31.10.2011, 20:07

Если Вы хотите остаться с чистым ударом, необходимо будет согласиться на решение с двумя передачами. Строковые замены Bash используют шарики, как в расширении пути и не регулярных выражениях. Единственные специальные символы в шариках *, ?, и [], чьи грубые эквиваленты в регулярных выражениях .*, ., и []. Смотрите на Wooledge вики и bash(1) страница справочника разделяет на Parameter Expansion и Pathname Expansion для большего количества информации.

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

3
27.01.2020, 20:09
  • 1
    Спасибо, я проверю ссылку. Мое беспокойство, я должен сделать эту работу несколько раз в целом сценарии, таким образом, мое единственное беспокойство было о повторении того же кода много раз идущей на компромисс удобочитаемостью. Так или иначе я предлагаю вежливое решение, которое я собираюсь отправить. Аплодисменты –  neurino 31.10.2011, 01:34
  • 2
    Вы могли поместить тот код в функцию, чтобы не повторять код. –  jw013 31.10.2011, 01:38
  • 3
    Это - то, что я делаю, но, как Вы знаете, колотить функции не может возвращаемые строки... или, по крайней мере, это было тем, что я думал прежде 10 минут назад, :) –  neurino 31.10.2011, 01:48
  • 4
    Здесь является некоторыми примерами с DOS and-don't-s - Bash Расширенный Globbing.. Для вышеупомянутого примера это было бы: shopt -s extglob; t="${t//+([^A-Za-z0-9])/-}" –  Peter.O 31.10.2011, 04:19
  • 5
    @fered: спасибо, очень интересное, я проверю его. Ваш URL ссылки имеет дополнительный символ и возвращает 404, рабочий является Bash Расширенный Globbing –  neurino 31.10.2011, 11:40

Теги

Похожие вопросы