我有以下字符串格式
str="aaa.[any_1].bbb.[any_2].ccc"
我有以下映射
MAP1:
any_1 ==> 1
cny_1 ==> 2
MAP2
any_2 ==> 1
bny_2 ==> 2
cny_2 ==> 3
在str
上执行的最佳命令是什么,考虑到上面的映射才能获得
$ command $str
aaa.1.bbb.1.ccc
答案 0 :(得分:1)
将map
个文件转换为sed
个脚本:
sed 's%^%s/%;s% ==> %/%;s%$%/g%' map?
将生成的脚本应用于输入字符串。您可以通过流程替换直接执行此操作:
sed 's%^%s/%;s% ==> %/%;s%$%/g%' map? | sed -f- <(echo "$str")
输出:
aaa.[1].bbb.[1].ccc
答案 1 :(得分:1)
更新:我现在认为我没有正确理解这个问题,因此我的解决方案是错误的。我将它留在这里是因为我不知道这个答案的部分内容是否对你的问题有帮助,但我鼓励你先看看其他答案。
不确定你的意思。但是这里有一些东西:
any_1="1"
any_2="2"
str="aaa.${any_1}.bbb.${any_2}.ccc"
echo $str
花括号告诉解释器变量名称的结束位置和正常的字符串恢复。结果:
aaa.1.bbb.2.ccc
你可以循环这个:
for any_1 in {1..2}; do
for any_2 in {1..3}; do
echo aaa.${any_1}.bbb.${any_2}.ccc
done
done
此处{1..3}
代表数字1,2和3.结果
aaa.1.bbb.1.ccc
aaa.1.bbb.2.ccc
aaa.1.bbb.3.ccc
aaa.2.bbb.1.ccc
aaa.2.bbb.2.ccc
aaa.2.bbb.3.ccc
答案 2 :(得分:0)
{
echo "${str}"
cat Map1
cat Map2
} | sed -n '1h;1!H;$!d
x
s/[[:space:]]*==>[[:space:]]*/ /g
:a
s/\[\([^]]*\)\]\(.*\)\n\1 \([^[:cntrl:]]*\)/\3\2/
ta
s/\n.*//p'
答案 3 :(得分:0)
我赞成@ chw21的答案,因为它促进了问题场景的正确工具。但是,
您可以根据以下内容设计基于perl
的命令。
#!/usr/bin/perl
use strict;
use warnings;
my $text = join '',<DATA>;
my %myMap = (
'any_1' => '1',
'any_2' => '2'
);
$text =~s/\[([^]]+)\]/replace($1)/ge;
print $text;
sub replace {
my ($needle) = @_;
return "\[$needle\]" if ! exists $myMap{ lc $needle};
return $myMap{lc $needle};
}
__DATA__
aaa.[any_1].bbb.[any_2].ccc
只需要一些解释的东西可能是正则表达式,它匹配方括号之间的文本并发送文本以替换例程。在replace例程中,我们从map中获取与其参数对应的映射值。
答案 4 :(得分:0)
$ cat tst.awk
BEGIN {
FS=OFS="."
m["any_1"]=1; m["cny_1"]=2
m["any_2"]=1; m["bny_2"]=2; m["cny_2"]=3
for (i in m) map["["i"]"] = m[i]
}
{
for (i=1;i<=NF;i++) {
$i = ($i in map ? map[$i] : $i)
}
print
}
$ awk -f tst.awk <<<'aaa.[any_1].bbb.[any_2].ccc'
aaa.1.bbb.1.ccc