Считайте, что у меня есть такой список:

list='item1.service item2.service item3.target item4.service'

Мне нужно отфильтровать этот список, чтобы получить что-то как:

item1 item2 item4

Итак, следует отметить две вещи:

  1. Мне нужно только держать предметы .service
  2. Мне нужны только "базовые" имена без суффикса .service .

И еще одна важная информация: я работаю на busybox, где инструменты часто калечатся (например: мой grep не поддерживает регулярные выражения Perl).

Я боролся против комбинаций sed и grep и лучшее, что я мог получить, это:

$ echo $list | grep -io '[a-z0-9\-\_@]*.service' | sed 's/\.service//'
item1
item2
item4

но он должен выполнить по существу одно и то же совпадение дважды для каждого входа, что выглядит не очень эффективно. Может ли кто-нибудь предложить лучшее решение, пожалуйста?

Заранее спасибо.

1 ответ1

1
list='item1.service item2.service item3.target item4.service'
echo "$list" | sed -r '

# Since the input is only one line, all commands will scan all the pattern space,
# so the commands order matters.

# replace for nothing unwanted text
s/[a-z0-9@_-]+\.target//

# replace for nothing unwanted suffix
# (with 'g' flag the command will replace all occurrences)
s/\.service//g

# squeeze double spaces
s/ +/ /g

# replace space for new line character
s/ /\n/g'

Я думаю, что это будет работать во всех версиях sed BusyBox (может быть и awk если он есть в вашем BusyBox).

Я только что скачал последнюю версию BusyBox и запустил make menuconfig но не смог найти никаких ссылок на регулярные выражения Perl.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .