我使用的是GNU sed版本4.2.1,我試圖編寫一個非貪婪的SED正則表達式來提取由另外兩個字符串分隔的字符串。這是很容易當的定界字符串是單個字符:如何編寫SED正則表達式來提取由另一個字符串分隔的字符串?
s:{\([^}]*\)}:\1:g
在該示例中的字符串被分隔「{」在左邊和「}」就對了。
如果限定字符串是多個字符,說「{{{」和「}}}」我可以調整上述表達式所示:
s:{{{\([^}}}]*\)}}}:\1:g
所以中心表達式匹配不包含任何的「 }}}'關閉字符串。但是這隻適用於匹配字符串根本不包含'}'的情況。喜歡的東西:
{{{cannot match {this broken} example}}}
不會工作,但
{{{can match this example}}}
確實工作。當然
s:{{{\(.*\)}}}:\1:g
始終工作,但是貪婪,所以不適合在同一行上出現多個模式。
我明白[^a]
意味着任何東西,除了a
和[^ab]
意味着任何東西,除了a
或b
所以,儘管它出現的工作,我不認爲[^}}}]
是排除連續3個字符序列的正確方法。
那麼如何寫一個SED的正則表達式匹配一個字符串,該字符串是另外兩個字符串的分隔符?
感謝您的回答 - 這正是我所懷疑的,因爲我知道sed不能展望未來。我發現我不需要在你的例子中轉義捕獲組:''s:{{{(。*?)}}}:$ 1 <:g''(實際上,當我這樣做時,工作)。 – starfry 2013-03-05 13:00:44
@starfry,哎呀,你是對的捕獲組。這是一個錯字。 – 2013-03-05 13:27:48