【问题标题】:sed command to delete a line matching a pattern is not working in my case在我的情况下,用于删除与模式匹配的行的 sed 命令不起作用
【发布时间】:2018-11-02 00:04:56
【问题描述】:

这些是我的文件 /etc/sysconfig/network-scripts/route-eth0 的内容:

192.168.1.12/32 via 172.16.1.60
192.168.1.0/24 via 172.16.60.1

我正在使用以下 sed 命令删除一行:

sed  -i  '#192.168.1.0/24 via 172.16.60.1#d'   /etc/sysconfig/network-scripts/route-eth0

但是匹配的行(在我们的例子中是第 2 行)没有被删除。有什么见解吗?

注意:我在 sed 命令中使用 #(hash symbol) 作为分隔符,因为 /(forward slash symbol) 是我的模式的一部分。

【问题讨论】:

  • 确保接受使用字符串比较的答案(例如,在 awk 中通过 index() 或 == 或 grep -Fx),或者如果它正在进行正则表达式比较,则每个 @987654326 都会转义@ 到 \. 并使用 ^ 和 $ 分隔符以避免删除错误的行。

标签: awk sed


【解决方案1】:

gnu sed 支持 REGEX 模式作为地址。你可以使用任何你喜欢的分隔符,就像s(替换)

你可以这样做:

sed '\%pat%d'
sed '\#pat#d'
sed '\@pat@d'

也就是说,您只需将代码中的第一个 # 转义,您的命令就会起作用。

【讨论】:

    【解决方案2】:

    如果在表达式中转义/ 字符有问题,您可以使用awk:

    awk -v search='192.168.1.0/24 via 172.16.60.1' '$0 != search' file > file.tmp \
    && mv file.tmp file
    

    或使用gawk:

    gawk -i inplace -v search='192.168.1.0/24 via 172.16.60.1' '$0 != search' file
    

    【讨论】:

    • Using a delimiter different than / is only supported by the s 错了。
    • 是的,看起来像。我学到了一些东西,谢谢。还要感谢@potong 的编辑!
    • PS:因为最初的错误答案而收到 3 分,我感到有点惭愧 :)
    【解决方案3】:

    使用 GNU sed:将第一个 # 替换为 \#。

    【讨论】:

      【解决方案4】:

      请您尝试关注一下。

      grep -v '192\.168\.1\.0/24 via 172\.16\.60\.1' Input_file > temp_file && mv temp_file Input_file
      

      awk:

      awk '!/192\.168\.1\.0\/24 via 172\.16\.60\.1/' Input_file > temp_file && mv temp_file Input_file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-08
        • 1970-01-01
        • 1970-01-01
        • 2017-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多