在这样的字符串中:
"<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
请注意.
分隔cfg1
和cfg2
个字符串。是否有一行(如果可能,在sed中)可以做到这一点?
更多条件:
+cfg1
和+cfg2
可以是任何字符串,可能会有更多字符串。因此,关键是不要包含这些已知的配置:testlength
,config
,print_match
,print_cfg
和quit_count
。+config=
的{{1}}之外,配置并不总是如上例所示。示例:
输入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
答案 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
这将用所需的第一个字符串替换第一个字符串,并向模式空间添加一个查找表,其中包含所有不需要的配置字符串。然后迭代地移除不需要的配置字符串,并将剩余的配置变换为所需的输出。