Как напечатать соответствие регулярному выражению
Моя проблема в два раза. Во-первых, это печать соответствия регулярному выражению. Второй фактическое регулярное выражение.
Проблема 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"