【问题标题】:Shell Script to parse/retrieve a string found after another string/match用于解析/检索在另一个字符串/匹配之后找到的字符串的 Shell 脚本
【发布时间】:2013-03-18 14:29:10
【问题描述】:

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

键是“域”,值是“sample.foo”。域密钥可以有多个“.”。在其中,所以我需要获取整个域密钥。

我不是最擅长正则表达式,但我想我需要使用“sed”。

我正在使用 $* 访问这个完整的字符串,如果我可以通过访问 $DOMAIN 来简单地引用密钥,那就太好了,但是由于我唯一的选择是基于位置访问 $3,并且位置可能会改变,所以不是一种选择

【问题讨论】:

    标签: string parsing shell sed


    【解决方案1】:

    使用 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);
    

    【讨论】:

      【解决方案2】:

      如果你有 perl,只需使用你的 shell 脚本中的这一行。

      domain=$( echo $* | perl -ne '/domain\s([^\s]+)\s/ and print "$1"' )
      

      或者,如果您更愿意使用sed:

      domain=$( echo $* | sed 's/.*\<domain \([^ ]\+\).*/\1/' )
      

      【讨论】:

        猜你喜欢
        • 2021-08-17
        • 2017-12-03
        • 2021-11-29
        • 2016-10-15
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多