Sed非贪婪的花括号匹配

时间:2010-06-01 20:05:42

标签: regex sed non-greedy

我在文件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获取所需的输出?

3 个答案:

答案 0 :(得分:6)

SED不支持非贪婪匹配,所以你需要让'。*'这个术语不那么贪婪,因为它会接受它的挑剔。我没有你正在寻找的那种东西的语料库,但我会假设你不想找到任何带嵌入式花括号的东西。如果是这样,那么你可以使用:

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

在你给出的情况下会起作用,但是如果这些东西嵌套就会失败。

答案 1 :(得分:4)

如果你知道 moslates 之间的字符串不包含花括号,你可以这样做:

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

答案 2 :(得分:2)

“需要得到” - 根据上下文,似乎“get”表示“删除”。但是,我通常会将“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”在该字符串中占据的位置(即两组“moslate”标签之间)中的任何内容:

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

输出:

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