【问题标题】:sh script to replace text in multiple filessh脚本替换多个文件中的文本
【发布时间】:2018-06-20 02:42:34
【问题描述】:

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

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

【问题讨论】:

  • 如果您展示到目前为止您尝试过的代码并描述您遇到的问题,您将在这里得到更友好的接待和更好的帮助。如果没有代码,您的问题看起来像是请求免费咨询,很多人不喜欢这样。
  • 当然。这是我尝试过的(非常业余,因为我不是 sh 脚本专家)
  • 另外,您使用的是什么操作系统? Linux、OSX 还是其他?
  • 我正在使用 Unix @John1024

标签: shell unix sed scripting sh


【解决方案1】:

使用 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 活动字符,则此处存在潜在危险。如果是这样,可能会删除或损坏任意文件。

使用 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 版本更安全。

【讨论】:

    猜你喜欢
    • 2018-01-06
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 2020-03-09
    • 2021-10-24
    • 2014-07-04
    相关资源
    最近更新 更多