Bash 脚本用于在文件中注释/取消注释行



我在Linux(Fedora 20)中有一个标准的文本配置文件。 大多数行应始终应用,但根据文件所在的计算机,需要"打开"(取消注释)和"关闭"少数行。 所以文件看起来像这样:

 ; configuration file
 parameter1 = a
 parameter2 = b
 optparameter1 = z     ; only applies to %%machine-1%%
 ; optparameter1 = x   ; only applies to %%machine-2%%
 parameter3 = c
 ; optparameter2 = x   ; only applies to %%machine-2%%
 optparameter2 = f     ; only applies to %%machine-1%%  

我想做的是运行一个脚本,该脚本将更改文件(或复制文件),根据命令行参数更改行的注释。 例如

 ./scriptname -u machine-2 -c machine-1 configurationFileName.conf

这将导致末尾注释中带有 %%machine-2%% 的所有行都未注释(当然,保留结尾注释),并且所有在末尾注释中带有 %%machine-1%% 的行都要被注释。

关于如何做到这一点的任何建议? 谢谢。

以下脚本将允许您"打开"和"关闭"特定行。在您的情况下,它将"关闭"包含机器-2 的所有行和"打开"包含机器-1 的行。脚本如下:

comm=$1
uncomm=$2
filename=$3
sed -i -e "/$comm/s/^;*/;/" $filename
sed -i -e "/$uncomm/s/^;//" $filename

你像这样运行它:

./scriptname machine-2 machine-1 configurationFileName.conf

第一个 sed 命令添加一个分号 (;)对于包含变量 $match 的行,如果该行已被注释,则保持原样。第二个删除行首的分号。

  • 为机器 1 启用配置(并禁用机器 2 的配置):

    $ sed -i -e 's/^;* *(.*machine-1.*)/1/p' 
             -e 's/^(.*machine-2.*)/;1/p' configurationFileName.conf
    
  • 为机器 2 启用配置(并禁用机器 1 的配置):

    $ sed -i -e 's/^;* *(.*machine-2.*)/1/p' 
             -e 's/^(.*machine-1.*)/;1/p' configurationFileName.conf
    

请注意,因为 ' -i ' sed 选项将直接修改 "configurationFileName.conf" 文件。

最新更新