2016-01-23 105 views
0

我有两个文件:
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

回答

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的相应元件和correct_array。希望你的文本文件中没有任何引号(单或双)。

+0

没有使用双引号。 –

+0

等一下,你的'correct.txt'和'wrong.txt'文件是否包含整个句子,还是只包含需要纠正的部分? – e0k

+0

整个句子。我想纠正第三个文件。 correct.txt和wrong.txt具有相同的句子。第二个判决者是错误的,首先,这些判决被纠正了。 –

0

您应该始终使用{}与数组。这不起作用:

$array[1] 

但这会:

${array[1]} 

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

不知道你的数组有什么不同,但我认为你想迭代它而不是使用整个事情。试试这种方法:

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

您的解决方案工作。 –

相关问题