【问题标题】:Sed non greedy curly braces matchsed 非贪婪花括号匹配
【发布时间】:2010-06-01 20:05:41
【问题描述】:

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

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

需要使用 sed 获取字符串 otra

有了这个正则表达式

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

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

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

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

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

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

【问题讨论】:

    标签: regex sed non-greedy


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        “需要获取” - 根据上下文,“获取”似乎是指“删除”。但是,我通常会将“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}
        

        【讨论】:

          猜你喜欢
          • 2011-08-29
          • 2023-04-06
          • 1970-01-01
          • 1970-01-01
          • 2017-10-16
          • 2012-06-06
          • 1970-01-01
          • 2015-02-11
          • 2017-05-07
          相关资源
          最近更新 更多