Bash脚本注释/取消注释文件中的行

时间:2014-12-29 14:34:31

标签: linux bash shell

我在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%%  

我想要做的是运行一个脚本来更改文件(或复制文件),根据命令行参数更改行的注释。 e.g。

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

这会导致所有带有%% machine-2 %%的行在最终评论中被取消注释(当然,留下最终评论),并且最后评论中包含%% machine-1 %%的所有行待评论。

有关如何执行此操作的任何建议?谢谢。

2 个答案:

答案 0 :(得分:4)

以下脚本将允许您“打开”和“关闭”特定行。在您的情况下,它将“关闭”包含 machine-2 和“打开”包含 machine-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 :(得分:3)

  • 启用machine1的配置(并禁用machine2的配置):

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

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

要小心,因为'-i'sed选项将直接修改“configurationFileName.conf”文件。