2013-09-24 166 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. –

相關問題