如何打印正则表达式匹配

如何打印正则表达式匹配

我的问题有两个。首先是打印正则表达式匹配。其次是实际的正则表达式。

问题 1:我试图将 yum grouplist --verbose 的输出打印成可以放入 puppet 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]

上述正则表达式匹配从第一个左括号开始的所有内容。我不知道如何让它从第二个括号开始匹配。我尝试修改正则表达式,使其不贪婪?但它只是继续匹配(缅甸语)支持(burmese-support)

答案1

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;

答案2

另一种选择,如果你喜欢简单的正则表达式

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

相关内容