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