我在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 %%的所有行待评论。
有关如何执行此操作的任何建议?谢谢。
答案 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”文件。