我有以下字符串格式就字符串的變化基於映射
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
我有以下字符串格式就字符串的變化基於映射
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
把你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
更新:我現在認爲我沒有正確認識這個問題,所以我的解決辦法是錯誤的。我將它留在這裏,因爲我不知道這個答案的一部分對你的問題是否有幫助,但我鼓勵你先看看其他答案。
不確定你的意思。但是這裏有一些東西:
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
{
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'
我已經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
只需要一點解釋的事情可能是正則表達式,它匹配方括號之間的文本併發送文本以替換例程。在替換例程中,我們從映射對應於其參數獲取映射值。
$ 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
爲什麼循環?有2個地圖與不同的密鑰(任何,bny,cny) – Tensibai
我不明白這是如何適用於這個問題。 –