2015-05-04 17 views
1

我有以下字符串格式就字符串的變化基於映射

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 

什麼是最好的exec命令在str與服用UTE考慮上述映射,以獲得

$ command $str 
aaa.1.bbb.1.ccc 

回答

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

更新:我現在認爲我沒有正確認識這個問題,所以我的解決辦法是錯誤的。我將它留在這裏,因爲我不知道這個答案的一部分對你的問題是否有幫助,但我鼓勵你先看看其他答案。

不確定你的意思。但是這裏有一些東西:

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 
+1

爲什麼循環?有2個地圖與不同的密鑰(任何,bny,cny) – Tensibai

+0

我不明白這是如何適用於這個問題。 –

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(甚至找到找到每個映射)。針對問題情景正確的工具 -
  • 基於事實,別名和值裏面有沒有空間
0

我已經upvoted @ 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 

只需要一點解釋的事情可能是正則表達式,它匹配方括號之間的文本併發送文本以替換例程。在替換例程中,我們從映射對應於其參數獲取映射值。

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