用字典值替换字符串中的字典键

Posted

技术标签:

【中文标题】用字典值替换字符串中的字典键【英文标题】:Replace dictionary key in string with dictionary value 【发布时间】:2018-09-11 04:35:09 【问题描述】:
for key in dictionary:
    file = file.replace(str(key), dictionary[key])

通过这个简单的 sn-p,我可以在文件中用它的值替换字典键的每个出现。 (Python)

在 bash 中是否有类似的方法?

例子:

文件="addMesh:"0x234544" addMesh="0x12353514"

$!dictionary[i]: 0x234544
$dictionary[i]: 0x234544x0


$!dictionary[i]: 0x12353514
$!dictionary[i]: 0x12353514x0

想要的输出(文件的新内容):"addMesh:"0x234544x0" addMesh="0x12353514x0"

for i in "$!dictionary[@]"
do   
  echo "key  : $i"
  echo "value: $dictionary[$i]"
  echo
done

【问题讨论】:

你能提供更多关于键和值的信息吗? @AndreyTyukin 已添加 【参考方案1】:

虽然肯定有more sophisticated methods to do this,但我发现以下内容更容易理解,也许它对您的用例来说已经足够快了:

#!/bin/bash

# Create copy of source file: can be omitted
cat addMesh.txt > newAddMesh.txt

file_to_modify=newAddMesh.txt

# Declare the dictionary
declare -A dictionary
dictionary["0x234544"]=0x234544x0
dictionary["0x12353514"]=0x12353514x0

# use sed to perform all substitutions    
for i in "$!dictionary[@]"
do   
  sed -i "s/$i/$dictionary[$i]/g" "$file_to_modify"
done

# Display the result: can be omitted
echo "Content of $file_to_modify :"
cat "$file_to_modify"

假设输入文件addMesh.txt包含

"addMesh:"0x234544"
addMesh="0x12353514"

生成的文件将包含:

"addMesh:"0x234544x0"
addMesh="0x12353514x0"

这个方法不是很快,因为它会多次调用sed。但它不需要sed 来生成其他sed 脚本或类似的东西。因此,它更接近于原始 Python 脚本。如果您需要更好的性能,请参阅链接问题中的答案。

【讨论】:

【参考方案2】:

在 Bash 中没有完美的等价物。鉴于dict 是关联数组,您可以采用迂回的方式:

# traverse the dictionary and build command file for sed
for key in "$!dict[@]"; do
  printf "s/%s/%s/g;\n" "$key" "$dict[$key]"
done > sed.commands

# run sed
sed -f sed.commands file > file.modified

# clean up
rm -f sed.commands

【讨论】:

以上是关于用字典值替换字符串中的字典键的主要内容,如果未能解决你的问题,请参考以下文章

用多个字典值替换字符串中的单词?

用空字符串替换字典数组中的 NSNull 值

Python递归替换嵌套字典键中的字符?

Python - 从键替换特殊字符,字典中的值

用字典的值替换字符串

如何根据字典替换熊猫系列中的字符串组,并将值作为列表?