0

我在文件 a.txt 中有一个字符串

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

需要otra使用 sed 获取字符串。

有了这个正则表达式

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

a 根本没有输出,但是当我将 a 添加?到正则表达式时

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

(我在某处读过它使正则表达式不贪婪)我根本没有匹配,我的意思是得到以下输出

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

如何使用 sed 获得所需的输出?

4

3 回答 3

6

SED 不支持非贪婪匹配,因此您需要通过使其接受的内容更加挑剔来减少“.*”术语的贪婪。我没有你正在寻找的那种东西的语料库,但我会假设你不想找到任何嵌入大括号的东西。如果是这样,那么您可以使用:

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

在您提供的情况下,这将起作用,但如果这些东西嵌套,则会失败。

于 2010-06-01T20:17:01.823 回答
4

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

sed 's/{moslate}[^{}]*{\/moslate}//g'
于 2010-06-01T20:14:39.813 回答
2

“需要获取” - 根据上下文,“获取”似乎是指“删除”。但是,我通常会将“get”解释为“retrieve”或“keep”。您的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}
于 2010-06-01T22:29:52.150 回答