sh脚本替换多个文件中的文本

时间:2018-01-10 20:40:26

标签: shell unix sed scripting sh

我正在尝试使用sed在一百多个文件中用“/ tools / common / test / HATS”替换字符串“/ net / origin / devdata1 / slin”的.prm文件中的每个匹配项。我认为我遇到了for循环的正确语法问题,循环遍历目录中的不同文件(/ home / AutoTest),以及我需要什么/作为命令行参数。提前谢谢。

OLD="/net/origin/devdata1/slin" 
NEW="/toolscommon/test/HATS" 
DIR="/home/AutoTest" 
for f in $DIR 
do 
    cp $f $f.bak 
   sed 's+$OLD+$NEW+g' $f.bak > $f 
   [ -f "$f" ] 
   rm -f $f.bak 
done

1 个答案:

答案 0 :(得分:0)

使用sed

尝试:

old="/net/origin/devdata1/slin"
new="/toolscommon/test/HATS"
dir="/home/AutoTest"
sed -i "s+$old+$new+g" "$dir"/*

sed -i将就地更新文件。

此外,最佳做法是为shell变量使用较低或混合大小写的名称。系统为其变量使用全大写字母名称,您不希望意外覆盖其中一个。

如果oldnew包含任何sed-active字符,则存在潜在危险。如果是这样,任意文件都可能被删除或损坏。

使用awk

old="/net/origin/devdata1/slin"
new="/toolscommon/test/HATS"
dir="/home/AutoTest"
awk -i inplace -v old="$old" -v new="$new" '{gsub(old, new)} 1' "$dir"/*

由于awk将oldnew视为数据而非代码,因此比sed版本更安全。