2013-09-24 88 views
2

我的要求是从输入文件中读取字符串,并用替换的字符串替换所有出现的字符串到输出文件中。 例子:Shell从一个文件中读取字符串并替换为其他文件

$ cat input 
BOB_XYZ "JOB.ABC" 
ROB_LOLA "TOT.XYZ" 
$ cat output 
{ 
BOB_XYZ is a BOB_XYZ 
I am BOB_XYZ 
} 

在这里,我需要从输出文件 “JOB.ABC” 取代 “BOB_XYZ”。我的意思是预期输出为

$ cat output 
{ 
"JOB.ABC" is a "JOB.ABC" 
I am "JOB.ABC" 
} 

请让我知道,我们是如何做到这一点

回答

-1
cat $1 | while read ORIGINAL REPLACEMENT; do 
    sed -ie "s/$ORIGINAL/$REPLACEMENT/g" $2 
done 

注施加场逐场的替代,这使得很多关于输入的假设和输出文件;例如你已经正确设置了IFS,你没有使用'/'或ORIGINAL或REPLACEMENT中的某些其他字符等。

+0

请注意,您可以将其称为例如。 “replacements.sh输入输出”,它会覆盖输出到位。 –

+1

不必在每次迭代中执行'sed',都可以建立整个行并将其传递给'ed',或者使用流程替换。 '当读取或者读取数据时,'printf'/ while%s /%s/g''$ o“”$ r“; done kojiro

+0

@kojiro,感谢您的解决方案,我喜欢这个简单的方法 – user2803710

1

用awk,这里是做这件事。通过inputoutput文件循环,收集从input的“变量”到一个数组aoutput

awk 'NR == FNR{a[$1]=$2; next}; 
    {for (i=1; i<=NF; ++i) if ($i in a) $i=a[$i]; print}' input output 
+0

上面的awk解决方案有效,但我想将字符串替换为相同的“输出”文件,而不是在控制台 – user2803710

+0

@ user2803710然后将输出重定向到一个文件。 – kojiro

+0

重定向到同一个文件将失败(如果您的shell中有set noclobber),或者将在命令启动时覆盖该文件,则将输出截断为长度为0. –

相关问题