2010-06-01 87 views
0

我有一個文件中的字符串A.TXT桑達非貪婪的大括號匹配

{moslate}alho{/moslate}otra{moslate}a{/moslate}

需要使用sed來得到字符串otra

有了這個表達式

sed 's|{moslate}.*{/moslate}||g' a.txt

一個得到任何輸出,但是當我添加?的正則表達式

s|{moslate}.*?{/moslate}||g a.txt

(我讀的地方,它使正則表達式非貪婪)我得不到任何匹配,我的意思是得到以下輸出

{moslate}alho{/moslate}otra{moslate}a{/moslate}

我怎樣才能得到所需的輸出使用sed?

回答

6

SED不支持非貪婪的匹配,所以你需要做的''''通過使它在接受的內容中更具挑剔性而減少貪婪。我沒有一個你正在尋找的東西的語料庫,但我會假設你不想找到任何嵌入大括號的東西。如果是這樣,那麼你可以使用:

sed 's|{moslate}[^{]*{/moslate}||g' a.txt

,將在你給情況下工作,但如果這些東西巢將失敗。 「

4

如果你知道moslates之間的字符串將不包含大括號,你可以這樣做:

sed 's/{moslate}[^{}]*{\/moslate}//g' 
2

」需要得到「 - 根據上下文,似乎通過」獲取「您的意思是」刪除「。但是,我通常將「get」解釋爲「檢索」或「保留」。您的sed命令所說的是「刪除所有內容」。你想要的輸出是什麼樣子?

假設你的意思是「檢索」或「保持」,試試這個:

sed -n 's|.*{/moslate}\([^{]*\){moslate}.*|\1|p' a.txt 

這將檢索「OTRA」或無論是在位置說:「OTRA」佔據該字符串(即兩者之間套「moslate」標籤)。

輸出結果:

otra 

如果要刪除 「OTRA」:

sed 's/otra//' a.txt 

輸出:

{moslate}alho{/moslate}{moslate}a{/moslate} 

如果你想刪除無論是在位置該「otra」佔據該字符串(即

sed -n 's|\(.*{/moslate}\)[^{]*\({moslate}.*\)|\1\2|p' a.txt 

輸出::

{moslate}alho{/moslate}{moslate}a{/moslate} 
兩套 「moslate」 標記)之間