我在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" 文件。