使用两个文件来搜索/替换第三个文件

时间:2016-01-23 22:50:04

标签: arrays bash file sed

我有两个文件:
correct.txt

  

天空是蓝色的   我喜欢吃苹果   。
  

wrong.txt

  

天空是蓝色的   我喜欢吃苹果   。
  。
  

两个文件中都有很多行。 现在,我想在" wrong.txt"中使用我的搜索来更正第三个文件。 使用" correct.txt"来纠正它。

我创建了两个文件:

readarray -t correct_array < correct.txt  
readarray -t wrong_array < wrong.txt

要更正的文件是 to_be_corrected.txt

这有效:

for c in "${correct_array[@]}"
do
    echo "$c"
done

我试过这个

for e in "${correct_array[@]}"
do
    sed -i.bak 's/$wrong_array[@]/$correct_array[@]/' to_be_corrected.txt
done

但这不起作用 如何将sed与数组一起使用?

2 个答案:

答案 0 :(得分:0)

您对'命令使用单引号(sed),因此shell不会评估变量$wrong_array[@]$correct_array[@]。尝试对变量使用双引号和括号。此外,您正在使用${correct_array[@]}整个数组。您需要将元素组合在一起,可能使用索引:

for ((e=0; e<"${#correct_array[@]}"; ++e)); do
    sed -i.bak "s/${wrong_array[$e]}/${correct_array[$e]}/" to_be_corrected.txt
done

这会在数组的索引上迭代e${#correct_array[@]}给出数组的大小),然后e用于索引wrong_array和{的相应元素{1}}。希望您的文本文件中没有任何引号(单引号或双引号)。

答案 1 :(得分:0)

您应始终对阵列使用{}。这不起作用:

$array[1]

但这会:

${array[1]}

正如e0k所指出的,你也应该使用双引号,否则变量不会扩展到它的实际值。

不知道你的数组有多少exaclty,但我认为你想迭代它而不是使用整个东西。试试这种方法:

for i in `seq 0 $((${#correct_array[@]}-1))`; do
  sed -i.bak "s/${wrong_array[$i]}/${correct_array[$i]}/" to_be_corrected.txt
done