Shell脚本用于解析/检索在另一个字符串/匹配后找到的字符串

时间:2013-03-28 08:14:47

标签: string parsing shell sed

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,并且位置可能会改变,不是一个选择

2 个答案:

答案 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/' )