У меня двоякая проблема. Сначала выводится совпадение с регулярным выражением. Второй - это собственно регулярное выражение.
Проблема 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"