2017-05-04 31 views
1

我是新來的正則表達式的世界,所以請善待在發脾氣:-)尋找之間的「{」和單個事件「:」在一個大的文本

我想僅打印第一在{:之間出現字符串。

實施例以下字符串:

({TRIGGER.VALUE} = 0和{的zabbix窗口:ZABBIX [過程,發現者,AVG,忙] .AVG(10M)}> 75)

({TRIGGER.VALUE} = 1和{的zabbix窗口:ZABBIX [過程,發現者,AVG,忙] .AVG(10M)}> 65)

我希望它輸出只有Zabbix windows

這怎麼可能?

我試過{([a-zA-Z0-9 ]*):它打印:並做了兩次。

感謝您的閱讀! 作者Srini

+0

使用['\ {([\ w \ s] +):。*'](https://regex101.com/r/0iVuAx/1)並獲取組1的值。你在使用什麼編程語言/工具?此外,可能會有更好的解決方案(如'Regex.Match(s,@「{([\ w \ s] +):」)。Groups [1] .Value' in C#)。另外,我不知道[你的正則表達式](https://regex101.com/r/p4msBK/1)是如何打印':'兩次的。 –

+0

Wiktor,感謝百萬人的快速回復。這正是我想要的,在這裏工作正常:https://regex101.com/ 但是當我嘗試在Ubuntu命令提示符下它不返回任何東西。我需要在Ubuntu命令行上做任何特殊的事情嗎? 這裏是我的ubuntu命令,從您給出的內容複製而來:egrep'\ {([\ w] +):。*'./a.log –

回答

2

你可以使用一個PCRE正則表達式與-o選項(提取的比賽,而不是返回全系)搶你所需要的文字,並使用head -1到只有第一場比賽:

s='({TRIGGER.VALUE}=0 and {Zabbix windows:zabbix[process,discoverer,avg,busy].avg(10m)}>75) or ({TRIGGER.VALUE}=1 and {Zabbix windows:zabbix[process,discoverer,avg,busy].avg(10m)}>65)' 
echo $s | grep -oP '(?<={)[\w\s]+(?=:)' | head -1 

見一個online demo

圖案的詳細資料

  • (?<={) - 必須有立即{到當前位置的左邊
  • [\w\s]+ - 1+字和/或空格字符
  • (?=:) - 必須有立即:到當前位置的右側。
+1

Perfect Wiktor!這爲我做了訣竅:-)。感謝百萬人的幫助! –