使用shell 完成递归替换键值的作用?

作者站长头像
站长
· 阅读数 9

背景

基于hw某项目的要求 提供了一套环境搭建的脚本 其中脚本提供了一个配置项的文件

里面定义了环境搭建过程过程中的诸多键值

现在华为说我之前定义的键不满足句意和规范 要修改 但是鉴于要求改的文件太多了且层级嵌套的深 决定使用shell脚本来完成.要求

  1. 排除某些特定的文件夹
  2. 打印出要修改的行
  3. 简洁明了 可读性强 且健壮性高

自己尝试写了一个 感觉美中不足 求大佬优化

#!/usr/bin/env bash
eval $(cat hcs.setting.maps | awk 'BEGIN{printf "declare -A keyMap=("} END {print ")"} {printf "[\"%s\"]=\"%s\" " , $1,$2}')
        declare -p keyMap
    for key in $(echo ${!keyMap[@]})
    do
    value=${keyMap[${key}]}
    echo "replace ${key}  ==>  $value"
    echo
    grep "${key}" -rl --exclude-dir={aarch64,x86_64} --exclude=*.{jpg,exe,gz} --exclude={hcs.setting.maps,automatichcskeyreplacementscript.sh} ./ | xargs grep "${key}" -n  
    echo "replaceing......"
    grep "${key}" -rl --exclude-dir={aarch64,x86_64} --exclude=*.{jpg,exe,gz} --exclude={hcs.setting.maps,automatichcskeyreplacementscript.sh} ./ | xargs sed -i "s/${key}/$value/"
    echo "replace ${key}"' ==> '"$value success!"
    done

其中hcs.setting.maps 是我定义的 oldKey ==> newKey 的转换文本标准

OLDkEY NEWkEY
SUPER MAN
APPLE PEAR
回复
1个回答
avatar
test
2024-07-12

优化了一波

#!/bin/bash
K=$(tput setaf 0)
R=$(tput setaf 1)
G=$(tput setaf 2)
Y=$(tput setaf 3)
B=$(tput setaf 4)
M=$(tput setaf 5)
C=$(tput setaf 6)
W=$(tput setaf 7)
# Use Q to revert color
Q=$(tput sgr0)

eval $(cat hcs.settings.maps | awk 'BEGIN{printf "declare -A keyMap=("} END {print ")"} {printf "[\"%s\"]=\"%s\" " , $1,$2}')

declare -p keyMap

for key in $(echo ${!keyMap[@]}); do
    echo ${Q}
    value=${keyMap[${key}]}
    echo "${B}replace ${R}${key}  ==>  ${C}$value${Q}"
    baseComputeSh="grep ${key} -rl --exclude-dir={aarch64,x86_64,.svn,04-document,05-sql,06-db} --exclude=*.{jpg,exe,gz} --exclude={hcs.settings.maps,automatichcskeyreplacementscript.sh} ./"
    mathedNum=$(eval $baseComputeSh | wc -l)
   echo
    echo "${B}The matched $key values are ${R}$mathedNum"
    echo
    eval $baseComputeSh | xargs grep "${key}" -n --color
    echo
    echo "${G}=============================================="
    echo "${M}High-speed replacement in progress, please wait"
    echo "=============================================="
    eval $baseComputeSh | xargs sed -i "s/${key}/$value/"
    echo "${B}All attribute values ${G}$key ${B}have been completely replaced ${R}$value ${R}!${G}"
    echo "=============================================="
done
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容