#!/bin/bash # 类名批量替换脚本 # 用法: ./1_rename_classes.sh set -e # 遇到错误立即退出 # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color echo -e "${GREEN}========================================${NC}" echo -e "${GREEN}白牌项目 - 类名批量替换工具${NC}" echo -e "${GREEN}========================================${NC}" # 项目根目录 PROJECT_ROOT="/Users/edwinqqq/Local/Company Projects/peko-ios" YUMI_DIR="$PROJECT_ROOT/YuMi" # 备份提醒 echo -e "${YELLOW}⚠️ 重要:此脚本会修改大量文件!${NC}" echo -e "${YELLOW}请确保你已经:${NC}" echo -e "${YELLOW}1. 提交了所有未保存的更改${NC}" echo -e "${YELLOW}2. 创建了新的 Git 分支${NC}" echo -e "${YELLOW}3. 做好了回滚准备${NC}" echo "" read -p "确认继续?(y/N): " confirm if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then echo "已取消操作" exit 0 fi # ========================================== # 第一步:定义新前缀 # ========================================== echo "" echo -e "${GREEN}[Step 1] 请输入新的类名前缀${NC}" echo "" read -p "YM 替换为 (例如: LK): " NEW_PREFIX_YM read -p "XP 替换为 (例如: SL): " NEW_PREFIX_XP read -p "PI 替换为 (例如: MT): " NEW_PREFIX_PI read -p "Moli 替换为 (例如: Nova): " NEW_PREFIX_MOLI read -p "MS 替换为 (例如: AS): " NEW_PREFIX_MS # 验证输入 if [[ -z "$NEW_PREFIX_YM" || -z "$NEW_PREFIX_XP" || -z "$NEW_PREFIX_PI" || -z "$NEW_PREFIX_MOLI" || -z "$NEW_PREFIX_MS" ]]; then echo -e "${RED}❌ 错误:所有前缀都必须输入${NC}" exit 1 fi echo "" echo -e "${GREEN}替换映射:${NC}" echo " YM → $NEW_PREFIX_YM" echo " XP → $NEW_PREFIX_XP" echo " PI → $NEW_PREFIX_PI" echo " Moli → $NEW_PREFIX_MOLI" echo " MS → $NEW_PREFIX_MS" echo "" read -p "确认以上映射正确?(y/N): " confirm_mapping if [[ "$confirm_mapping" != "y" && "$confirm_mapping" != "Y" ]]; then echo "已取消操作" exit 0 fi # ========================================== # 第二步:创建临时白名单(不应该被替换的字符串) # ========================================== echo "" echo -e "${GREEN}[Step 2] 扫描可能误伤的字符串常量...${NC}" # 创建临时目录 TEMP_DIR="$PROJECT_ROOT/issues/temp_rename" mkdir -p "$TEMP_DIR" # 查找所有包含旧前缀的字符串常量 grep -rn "\".*YM.*\"" "$YUMI_DIR" --include="*.m" --include="*.h" > "$TEMP_DIR/string_constants_YM.txt" 2>/dev/null || true grep -rn "\".*XP.*\"" "$YUMI_DIR" --include="*.m" --include="*.h" > "$TEMP_DIR/string_constants_XP.txt" 2>/dev/null || true grep -rn "\".*Moli.*\"" "$YUMI_DIR" --include="*.m" --include="*.h" > "$TEMP_DIR/string_constants_Moli.txt" 2>/dev/null || true echo -e "${YELLOW}找到的字符串常量已保存到:${NC}" echo " $TEMP_DIR/string_constants_*.txt" echo -e "${YELLOW}请检查这些文件,确保没有不应该被替换的内容${NC}" echo "" read -p "检查完成后按回车继续..." # ========================================== # 第三步:替换文件内容 # ========================================== echo "" echo -e "${GREEN}[Step 3] 开始替换文件内容...${NC}" # 函数:替换文件内容 replace_in_files() { local old_prefix=$1 local new_prefix=$2 local file_count=0 echo " 替换 $old_prefix → $new_prefix ..." # 查找所有 .h 和 .m 文件 while IFS= read -r file; do # 跳过 Pods 目录 if [[ "$file" == *"/Pods/"* ]]; then continue fi # 执行替换(使用 Perl 的正则,更精确) # 只替换类名、方法名、属性名,不替换字符串字面量 perl -i -pe "s/\b${old_prefix}([A-Z][a-zA-Z0-9]*)/${new_prefix}\1/g" "$file" ((file_count++)) # 显示进度 if ((file_count % 50 == 0)); then echo " 已处理 $file_count 个文件..." fi done < <(find "$YUMI_DIR" -type f \( -name "*.h" -o -name "*.m" \)) echo -e "${GREEN} ✓ 完成!共处理 $file_count 个文件${NC}" } # 依次替换各个前缀 replace_in_files "YM" "$NEW_PREFIX_YM" replace_in_files "XP" "$NEW_PREFIX_XP" replace_in_files "PI" "$NEW_PREFIX_PI" replace_in_files "Moli" "$NEW_PREFIX_MOLI" replace_in_files "MS" "$NEW_PREFIX_MS" # 特殊处理:YUMI(全大写) echo " 替换 YUMI → ${NEW_PREFIX_YM}I ..." find "$YUMI_DIR" -type f \( -name "*.h" -o -name "*.m" \) -exec sed -i '' "s/YUMI/${NEW_PREFIX_YM}I/g" {} + # ========================================== # 第四步:重命名文件 # ========================================== echo "" echo -e "${GREEN}[Step 4] 重命名文件...${NC}" rename_files() { local old_prefix=$1 local new_prefix=$2 local file_count=0 echo " 重命名 ${old_prefix}* → ${new_prefix}* ..." # 查找所有以旧前缀开头的文件 find "$YUMI_DIR" -type f \( -name "${old_prefix}*.h" -o -name "${old_prefix}*.m" \) | while read file; do # 跳过 Pods 目录 if [[ "$file" == *"/Pods/"* ]]; then continue fi dir=$(dirname "$file") filename=$(basename "$file") newname=$(echo "$filename" | sed "s/^${old_prefix}/${new_prefix}/") if [[ "$filename" != "$newname" ]]; then mv "$file" "$dir/$newname" ((file_count++)) fi done echo -e "${GREEN} ✓ 完成!共重命名 $file_count 个文件${NC}" } rename_files "YM" "$NEW_PREFIX_YM" rename_files "XP" "$NEW_PREFIX_XP" rename_files "PI" "$NEW_PREFIX_PI" rename_files "Moli" "$NEW_PREFIX_MOLI" rename_files "MS" "$NEW_PREFIX_MS" # ========================================== # 第五步:重命名文件夹 # ========================================== echo "" echo -e "${GREEN}[Step 5] 重命名模块文件夹...${NC}" cd "$YUMI_DIR/Modules" # 重命名模块文件夹 if [ -d "YMLogin" ]; then mv "YMLogin" "${NEW_PREFIX_YM}Login" echo " ✓ YMLogin → ${NEW_PREFIX_YM}Login" fi if [ -d "YMMessage" ]; then mv "YMMessage" "${NEW_PREFIX_YM}Message" echo " ✓ YMMessage → ${NEW_PREFIX_YM}Message" fi if [ -d "YMMine" ]; then mv "YMMine" "${NEW_PREFIX_YM}Mine" echo " ✓ YMMine → ${NEW_PREFIX_YM}Mine" fi if [ -d "YMMonents" ]; then mv "YMMonents" "${NEW_PREFIX_YM}Monents" echo " ✓ YMMonents → ${NEW_PREFIX_YM}Monents" fi if [ -d "YMNewHome" ]; then mv "YMNewHome" "${NEW_PREFIX_YM}NewHome" echo " ✓ YMNewHome → ${NEW_PREFIX_YM}NewHome" fi if [ -d "YMRoom" ]; then mv "YMRoom" "${NEW_PREFIX_YM}Room" echo " ✓ YMRoom → ${NEW_PREFIX_YM}Room" fi if [ -d "YMTabbar" ]; then mv "YMTabbar" "${NEW_PREFIX_YM}Tabbar" echo " ✓ YMTabbar → ${NEW_PREFIX_YM}Tabbar" fi if [ -d "YMRTC" ]; then mv "YMRTC" "${NEW_PREFIX_YM}RTC" echo " ✓ YMRTC → ${NEW_PREFIX_YM}RTC" fi if [ -d "YMWeb" ]; then mv "YMWeb" "${NEW_PREFIX_YM}Web" echo " ✓ YMWeb → ${NEW_PREFIX_YM}Web" fi # ========================================== # 第六步:更新 Xcode 项目文件引用 # ========================================== echo "" echo -e "${GREEN}[Step 6] 更新 Xcode 项目文件引用...${NC}" XCODEPROJ="$PROJECT_ROOT/YuMi.xcodeproj/project.pbxproj" if [ -f "$XCODEPROJ" ]; then # 备份原文件 cp "$XCODEPROJ" "$XCODEPROJ.backup" # 替换项目文件中的引用 sed -i '' "s/YM/${NEW_PREFIX_YM}/g" "$XCODEPROJ" sed -i '' "s/XP/${NEW_PREFIX_XP}/g" "$XCODEPROJ" sed -i '' "s/PI/${NEW_PREFIX_PI}/g" "$XCODEPROJ" sed -i '' "s/Moli/${NEW_PREFIX_MOLI}/g" "$XCODEPROJ" sed -i '' "s/MS/${NEW_PREFIX_MS}/g" "$XCODEPROJ" sed -i '' "s/YUMI/${NEW_PREFIX_YM}I/g" "$XCODEPROJ" echo -e "${GREEN} ✓ Xcode 项目文件已更新${NC}" else echo -e "${RED} ⚠️ 未找到 Xcode 项目文件${NC}" fi # ========================================== # 第七步:生成替换报告 # ========================================== echo "" echo -e "${GREEN}[Step 7] 生成替换报告...${NC}" REPORT_FILE="$TEMP_DIR/rename_report.txt" cat > "$REPORT_FILE" <