【发布时间】:2012-08-27 08:23:17
【问题描述】:
我目前正在编写一个 Perl 脚本来解析一个配置文件。语法如下
{command parameter1 parameter2}
第二个参数是可选的。首先,我只想提取{ 和} 之间的内容。我正在使用此代码
while (<FILE>) {
chomp;
unless ($_ =~ m/^\/\//) {
$_ =~ /^\{(.*?)\}/s;
print $1;
}
字符串将被进一步评估,而不是print 命令。我现在的问题是脚本停止使用某些字符串
只要参数周围有引号,脚本就可以工作。这个
{exec sed 's/ClientAliveInterval\ 300/ClientAliveInterval\ 1800/\' /etc/ssh/sshd_config > /etc/ssh/sshd_config.new}
将返回括号之间的内容,但由于可能有第二个参数,现在很难区分没有引号的参数
其他字符串,如
{exec "cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak"}
{exec "/etc/init.d/ssh reload"}
完美运行,包括引号。
但是现在,引号中的字符串,包括斜杠或加号(可能还有其他),此时只会冻结 perl 脚本:
{exec "chmod +x /root/setSSHTimer.sh"}
{exec "sed 's/ClientAliveInterval\ 300/ClientAliveInterval\ 1800/\' /etc/ssh/sshd_config > /etc/ssh/sshd_config.new"}
都带引号。将第一个重写为“chmod 770 ...”时,它再次起作用。
任何想法是什么导致了这里的问题?
【问题讨论】:
-
老实说,我建议使用更强大的配置设置,例如 JSON 或 XML。
-
正如 Jack 所说,如果您在解析自己的设计以获取配置语法时遇到问题,那么就出现了严重错误。该文件可以看起来像您想要的那样,并且您遇到的问题可以通过将命令和参数放在单独的行上来解决,例如,用一个空行来分隔它们。您是否考虑了包含
{}字符的参数?