根据映射对字符串进行更改

时间:2015-05-04 09:22:59

标签: linux bash shell awk sed

我有以下字符串格式

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

5 个答案:

答案 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'
  • 您可以使用多个映射,不限于2(偶数并找到每个映射找到的猫)。
  • 基于别名和值内部没有空间的事实(如果有的话可以调整)

答案 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