如何打印正则expression式匹配

我的问题是双重的。 首先是打印一个正则expression式匹配。 第二个是实际的正则expression式。

问题1 :我试图将yum grouplist的输出–verbose打印成我可以放入puppet conf文件的格式。 因此,我需要打印更多的比赛,所以sed和grep -o将不起作用(至less不是我所知道的)。

以下是一些输出的例子:

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

我希望包含(* – 支持)的所有输出行被打印出来:

  '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] 

上面的正则expression式与第一个左括号相匹配。 我不知道如何从第二个括号开始比赛。 我试过修改正则expression式是非贪婪的? 但它只是继续ot匹配(缅甸)支持(缅甸支持)

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

因为您不能将单引号embedded单引号string中,所以对sed脚本使用双引号。

通过您的示例input:

 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; 

另一个,如果你喜欢你的正则expression式

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