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

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

Проблема 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]

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

2 ответа

Решение
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"
Другие вопросы по тегам