Назад | Перейти на главную страницу

Как распечатать совпадение регулярного выражения

У меня двоякая проблема. Сначала выводится совпадение с регулярным выражением. Второй - это собственно регулярное выражение.

Проблема 1: Я пытаюсь распечатать вывод yum grouplist --verbose в формате, который можно поместить в файл conf марионетки. Следовательно, мне нужно напечатать больше, чем просто совпадение, поэтому sed и grep -o не будут работать (по крайней мере, я не знаю).

Вот примеры некоторых результатов:

   Maori Support (maori-support) [mi]
   Mongolian Support (mongolian-support) [mn]
   Mynamar (Burmese) Support (burmese-support) [my]
   Nepali Support (nepali-support) [ne]

Я хочу, чтобы все выходные строки, содержащие (* -support), распечатывались как:

 'maori-support': ensure => absent;
 'mongolian-support': ensure => absent;
 'burmese-support': ensure => absent;
 'nepali-support': ensure => absent;

Я уже выполнил это вручную, но я хотел бы выяснить, как сделать это в одну строку, просто ради знаний.

Я пробовал awk и perl безрезультатно. Самое близкое, что я смог найти, - это использовать perl следующим образом:

 $ yum grouplist --verbose | perl -nwe 'print "$1: ensure\t=> absent;\n" if /\((.+-support)\)'

Проблема 2: однако это не включает одинарные кавычки в вывод. Также есть проблема, что одна из выходных строк выглядит так:

 Mynamar (Burmese) Support (burmese-support) [my]

Приведенное выше регулярное выражение соответствует всему, начиная с первой открывающей скобки. Я не знаю, как заставить его начать совпадение со второй круглой скобки. Я пробовал изменить регулярное выражение, чтобы оно не было жадным? но это просто продолжается ot match (бирманский) Support (бирманский-support)

yum grouplist --verbose 2>/dev/null |
sed -n "s/.*(\([^)]\+-support\)).*/'\1': ensure => absent;/p"

Использование двойных кавычек для сценария sed, поскольку вы не можете вставлять одинарные кавычки в одну строку в кавычках.

С вашим образцом ввода:

echo "   Maori Support (maori-support) [mi]
   Mongolian Support (mongolian-support) [mn]
   Mynamar (Burmese) Support (burmese-support) [my]
   Nepali Support (nepali-support) [ne]
" | sed -n "s/.*(\([^)]\+-support\)).*/'\1': ensure => absent;/p"
'maori-support': ensure => absent;
'mongolian-support': ensure => absent;
'burmese-support': ensure => absent;
'nepali-support': ensure => absent;

Еще один дубль, если вам нравится ваше простое регулярное выражение

rev | cut -d ' ' -f2 | rev | tr '()' "'" | sed -n "/-support'/s/\$/: ensure => absent;/p"