代码之家  ›  专栏  ›  技术社区  ›  Dean Christian Armada

使用sed删除文件中除定义的多个模式之外的行

  •  0
  • Dean Christian Armada  · 技术社区  · 7 年前
    #!/bin/bash  #general
    
    Remove this line
    
    echo armada  #dev
    
    Remove me also  #malfunction
    

    我有一个像上面这样的文件。我只想和 #general #dev 留下来。

    我试过了 sed -i '' '/#dev/!d' starter.sh 但这只会保留 第二代

    我试过了 sed -i '' '/#dev/!d;/#general/!d' starter.sh 但这将消除所有。

    我想知道是否可以保留两者 #概述 第二代 使用SED

    注意: 我在用Mac

    2 回复  |  直到 7 年前
        1
  •  2
  •   anubhava    7 年前

    你可以用这个 sed :

    sed -E '/#dev|#general/!d' file
    

    #!/bin/bash  #general
    echo armada  #dev
    

    或者,如果要保留空行,请使用:

    sed -E '/^[[:blank:]]*$|#(dev|general)/!d' file
    
        2
  •  1
  •   tripleee    7 年前

    这个 !d 操作显示“应删除与此地址不匹配的任何内容”。您需要重构逻辑,对每个匹配的地址说“跳过这个”,然后删除剩余的内容。

    这个 b “branch”操作跳过当前行的脚本剩余部分(如果还有行,则从脚本开始处继续处理下一行)。

    sed -i -e '/#dev/b' -e '/#general/b' -e 'd' starter.sh
    

    另外,修改shell脚本似乎是错误的。您可以使用整个编程语言;为什么不使用它来决定要执行脚本的哪些部分?

    #!/bin/sh
    
    case $1 in
     '--dev' | '--general') ;;
     *) echo 'Execute this if not run with --dev or general' >&2 ;;
    esac
    
    echo armada
    
    case $1 in
     '--malfunction') echo 'This too' >&2;;
    esac
    
    推荐文章