使用sed

时间:2015-12-07 12:01:02

标签: regex bash unix awk sed

在这样的字符串中:

"<testcase_name> +config=<main_cfg> +cfg1=<cfg1> +cfg2=<cfg2> +testlength=<string> +print_cfg=<string> +print_match=<string> +quit_count=<string>"

我想提取仅在+cfg1=+cfg2=之后的字符串,而不包括这些特定配置:+config=+testlength=+print_match=+print_cfg=+quit_count=

所以我想将结果存储在一个变量中,并能够将其视为:

echo "other_cfg = $other_cfg"
% other_cfg = cfg1.cfg2

请注意.分隔cfg1cfg2个字符串。是否有一行(如果可能,在sed中)可以做到这一点?

更多条件:

  1. +cfg1+cfg2可以是任何字符串,可能会有更多字符串。因此,关键是不要包含这些已知的配置:testlengthconfigprint_matchprint_cfgquit_count
  2. 除了始终是第一个+config=的{​​{1}}之外,配置并不总是如上例所示。
  3. (1)中提到的任何已知配置可能不存在于该行中。
  4. 示例:

    输入1:

    testA +config=reg +input=walk1s +print_match=1 +testlength=short

    预期产出1:

    % other_cfg = walk1s

    输入2:

    testA +config=mem +quit_count=50 +order=reverse +input=rand +testlength=long

    预期产出2:

    % other_cfg = reverse.rand

3 个答案:

答案 0 :(得分:2)

sed用于单个行上的简单替换,即全部。这不是什么问题,所以它不是sed的工作,它是awk的工作。

$ cat file
"<testcase_name> +config=<main_cfg> +cfg1=<cfg1> +cfg2=<cfg2> +testlength=<string> +print_cfg=<string> +print_match=<string> +quit_count=<string>"
testA +config=reg +input=walk1s +print_match=1 +testlength=short
testA +config=mem +quit_count=50 +order=reverse +input=rand +testlength=long

$ cat tst.awk
BEGIN{
    FS="[ =]+"
    split("config testlength print_match print_cfg quit_count",tmp)
    for (i in tmp) {
        skip_cfgs["+"tmp[i]]
    }
}
{
    other_cfg = ""
    for (i=2;i<=NF;i+=2) {
        if ( !($i in skip_cfgs) ) {
            other_cfg = (other_cfg=="" ? "" : other_cfg ".") $(i+1)
        }
    }
    print "% other_cfg =", other_cfg
}

$ awk -f tst.awk file
% other_cfg = <cfg1>.<cfg2>
% other_cfg = walk1s
% other_cfg = reverse.rand

答案 1 :(得分:0)

如果保证+cfg1+cfg2始终按行中的顺序排列,那么是;只是替换掉其他所有内容:

sed 's/.*+cfg1=<//;s/>.*+cfg2=<//;s/>.*//'

否则,您至少需要awk

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -r 's/^\S+\s+(.*)$/other_cfg = \1\n+config=+testlength=+print_match=+print_cfg=+quit_count=/;:a;s/ (\+\S+=)\S+(.*\n.*)\1/\2/;ta;s/ \+[^=]*=/./g;s/\./ /;P;d' file

这将用所需的第一个字符串替换第一个字符串,并向模式空间添加一个查找表,其中包含所有不需要的配置字符串。然后迭代地移除不需要的配置字符串,并将剩余的配置变换为所需的输出。