【问题标题】:sed match one condition but not the othersed 匹配一个条件但不匹配另一个
【发布时间】:2021-05-13 11:32:19
【问题描述】:

我正在尝试匹配 "text"}, 但不是 "text"}}, 具体:}, vs }},

我怎么能用 sed 写这个?

我试过了:s/\},

【问题讨论】:

  • 您好,问题解决了吗?您需要更多帮助吗?

标签: linux unix sed


【解决方案1】:

注意}}, 包含},。试试/"},/

【讨论】:

    【解决方案2】:

    我还没有测试过,但是试试:

    sed -i "/\b\("text"},\)\b/d" sourceFileName
    

    【讨论】:

      【解决方案3】:

      你可以使用

      sed -E 's/(^|[^}])\},/\1/g' file > newfile
      

      这里,

      • -E 启用 POSIX ERE 语法
      • (^|[^}])\}, 匹配字符串的开头或除} 之外的任何字符,并将此值捕获到第 1 组(在替换模式中使用 \1 引用),然后匹配 },
      • g - 替换所有匹配项。

      如果您只是使用\1 作为替换,这将简单地删除},,如果需要替换,请添加一些文本。

      【讨论】:

      • @dataviews 你能解释一下吗?最好的办法是提供一些测试用例,比如说,通过 ideone,参见 the demo,它的工作原理是它仅在 } 前面没有另一个 } 时才会删除 },
      【解决方案4】:

      如果您想考虑perl,那么使用否定的后向断言非常简单。

      cat file
      text"}, but not "text"}}, foobar"}, but not "xyz123"}},
      
      perl -pe 's/(?<!})},/##/g' file
      text"## but not "text"}}, foobar"## but not "xyz123"}},
      

      这里(?&lt;!}) 是否定的lookbehind,如果我们在}, 之前有一个},则匹配失败。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-30
        • 1970-01-01
        相关资源
        最近更新 更多