【问题标题】:Remove/Add Comment from config file using sed [duplicate]使用 sed 从配置文件中删除/添加注释 [重复]
【发布时间】:2022-01-20 20:03:14
【问题描述】:

我有一个包含以下数据的文件。

192.168.1.1
255.255.255.0
192.168.1.10

192.168.1.2
255.255.255.0
192.168.1.10

#192.168.2.1
#255.255.255.0
#192.168.2.10

#192.168.2.2
#255.255.255.0
#192.168.2.10

现在我想实现以下目标

  1. 从已经有它的行的开头删除#。
  2. 将# 放在没有它的行的开头。

最终文件的样子

#192.168.1.1
#255.255.255.0
#192.168.1.10

#192.168.1.2
#255.255.255.0
#192.168.1.10

192.168.2.1
255.255.255.0
192.168.2.10

192.168.2.2
255.255.255.0
192.168.2.10

我试图通过 sed 在我的脚本中使用以下命令来实现这一点,但它不起作用。

用于评论

sed -i -e "/192.168.1./{N;N;p;}/s/^#*/#/"

删除评论

sed -i -e "/192.168.2./{N;N;p;}/s/^#*//"

但是 sed 在下面抛出错误。

sed: -e expression #1, char 21: extra characters after command

任何建议。

【问题讨论】:

    标签: linux bash sed script


    【解决方案1】:

    这样的事情会起作用:

    sed '/^#/{s/^#//;b};/./s/^/#/' infile
    

    更具可读性:

    sed '
        /^#/ {       # If a line starts with "#"
            s/^#//   # Remove the leading "#"
            b        # Move to next line
        }
        /./s/^/#/      # If the line is not empty, prepend "#"
    ' infile
    

    【讨论】:

    • 嗨@bejamin,代码还删除了#192.168.1.1输出为#92.168.1.1的行的第一个字符,对于未注释的行,它没有添加#。
    • 也许是sed 's/^#//;t;s/^./#&/' file ?
    • 哦,糟糕,我将第二个替换项修改为 /./s/^/#/,现在它不再删除任何内容。
    【解决方案2】:

    这可能对你有用(GNU sed):

    sed -z 'y/\n/\x00/;s/^[^#]/\n&/mg;s/^#//mg;y/\x00\n/\n#/' file
    

    利用-z 选项将文件插入模式空间(仅限GNU)。

    将换行符转换为空值。

    在任何非空且不以# 开头的行的开头插入换行符。

    删除行首的所有#。

    将空值转换回换行符并将换行符转换为 #'s。

    注意替换命令上的m 标志使用空值来分隔行,因此使用^ 和$。

    另一个类似的想法:

    sed 'H;$!d;x;s/.//;s/^[^#]/\x00&/mg;s/^#//mg;y/\x00/#/' file
    

    另一种更简单的解决方案:

    sed 's/^#//;t;s/^./#&/' file
    

    【讨论】:

    • sed 's/^#//;t;s/^./#&/' 文件解决了这个问题,谢谢
    【解决方案3】:

    不确定你的表达有什么错误,但想到的一个技巧是:

    1. 将# 添加到所有行(因此注释行将以## 开头)
    2. 删除所有##s。

    也就是说,如果您的 bash 脚本中有一个循环,您可以执行以下操作:

    
    for line in $(cat myfile.txt); do
        echo "#$line" | sed -E 's|^(##)?(.*)|\2|'
    done
    

    【讨论】:

    • 你的技巧很有效,但它会在终端上提供输出,我如何使用它来修改文件。
    • 只需运行脚本并将输出重定向到您的文件,例如./myscipt.sh > myfile.txt
    猜你喜欢
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    相关资源
    最近更新 更多