regex - Sed正则表达式和子字符串取反

标签 regex sed

查找而不是匹配特定模式的子字符串(在特定字符串之前和之后的字符串)的正确语法是什么?

例如,我想要所有以BEGIN_开头,以_END结尾的子字符串,并且介于两者之间的子字符串是而不是等于FOO;并将整个子字符串替换为“(内部子字符串)”格式。以下将匹配:

  • BEGIN_bar_END-> (bar)
  • BEGIN_buz_END-> (buz)
  • BEGIN_ihfd8f398IHFf9f39_END-> (ihfd8f398IHFf9f39)

  • 但是BEGIN_FOO_END不匹配。

    我玩过以下内容,但似乎找不到正确的语法:
    sed -e 's/BEGIN_(^FOO)_END/($1)/g'
    sed -e 's/BEGIN_([^FOO])_END/($1)/g'
    sed -e 's/BEGIN_(?!FOO)_END/($1)/g'
    sed -e 's/BEGIN_(!FOO)_END/($1)/g'
    sed -e 's/BEGIN_(FOO)!_END/($1)/g'
    sed -e 's/BEGIN_!(FOO)_END/($1)/g'
    

    最佳答案

    IIRC中的sed中没有通用的否定运算符,因为编译与DFAs否定的正则表达式需要花费指数时间。您可以解决此问题

    '/BEGIN_FOO_END/b; s/BEGIN_\(.*\)_END/(\1)/g'
    
    /BEGIN_FOO_END/b的意思是:如果找到BEGIN_FOO_END,则分支(跳转)到sed脚本的末尾。

    关于regex - Sed正则表达式和子字符串取反,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9053100/

    相关文章:

    java - 如何使用正则表达式从该行中提取子字符串

    c# - 正则表达式查找 3 个括号之间包含的字符串

    linux - Bash Shell - 第二次出现某个字符后返回子字符串

    linux - 如何查找网络接口(interface)名称

    linux - 使用 Groovy 和 SED 命令用变量替换字符串

    python - 正则表达式拆分为多行

    python - 如何在Python中的正则表达式中匹配任一或组?

    php - 没有重复字符的Mysql正则表达式搜索

    sed - 使用 sed/grep/awk 删除所有内容直到第一个空行

    linux grep 模式中未知数量的列