shell脚本将传递一串参数。我想要解析的键/值的位置可能会随着时间的推移而改变,即它可能在任何时间在另一个键之前或之后,因此在两个键之间进行解析将不是一个选项。
我希望用这样的字符串解析域密钥:
maxpark 0 maxsub n domain sample.foo maxlst n max_defer_fail_percentage user oli force no_cache_update 0 maxpop n maxaddon 0 locale en contactemail
密钥将是“domain”,值为“sample.foo”。域密钥可能有多个'。'因此我需要获取整个域密钥。
我不是最好的正则表达式,但我想用'sed'是我需要做的。
我正在使用$ *访问此完整字符串,如果我可以通过访问$ DOMAIN来简单地引用该键,那将是很好的,但由于我唯一的选择是基于位置访问,$ 3,并且位置可能会改变,不是一个选择
答案 0 :(得分:0)
使用PERL解决了这个问题。
#!/usr/bin/perl -w
use strict;
my %OPTS = @ARGV;
open(FILE, "</var/named/$OPTS{'domain'}.db") || die "File not found";
my @lines = <FILE>;
close(FILE);
my @newlines;
foreach(@lines) {
$_ =~ s/$LOCAL_IP/$PUBLIC_IP/g;
push(@newlines,$_);
}
open(FILE, ">/var/named/$OPTS{'domain'}.db") || die "File not found";
print FILE @newlines;
close(FILE);
答案 1 :(得分:0)
如果你有perl,只需在shell脚本中使用这个单行程序。
domain=$( echo $* | perl -ne '/domain\s([^\s]+)\s/ and print "$1"' )
或者,如果您只是使用sed
:
domain=$( echo $* | sed 's/.*\<domain \([^ ]\+\).*/\1/' )