Puppet

如何列印正則表達式匹配

  • July 18, 2014

我的問題是雙重的。首先是列印正則表達式匹配。第二個是實際的正則表達式。

問題 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]

上面的正則表達式匹配第一個左括號中的所有內容。我不知道如何讓它從第二個括號開始比賽。我嘗試將正則表達式修改為非貪婪的?但它只是繼續不匹配(緬甸)支持(緬甸支持)

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;

引用自:https://serverfault.com/questions/613428