修改实现属性名

这个脚本`replace.sh`用于在Objective-C源文件中批量查找并替换特定属性的名称。它利用`grep`和`sed`命令,分别匹配带有block的属性和普通属性,并在找到后去除特殊字符,然后在所有文件中进行全局替换,实现属性名称的前缀和后缀添加。
摘要由CSDN通过智能技术生成

修改实现文件的属性名

准备

grep命令

  • -o:只输出匹配的字符串;
  • -E: 使用延展的正则表达式
    在尝试匹配形如
    @property (copy, nonatomic)(^result)(UIView *view), @property(nonatomic)(^_getResult)(id res)中粗体的匹配字符串时,可以使用
grep -o -E "\(\^[[:alpha:]_]+\)"

在尝试匹配形如 id params;UIViewController *controller ;时,可以使用

grep -o -E "[ \*][[:alpha:]_]+ *;"

sed

  • sed 's/${original}/${replacement}/g’
    使用该命令可以将字符串中的目标字符串original使用自定义字符串replacement来进行替换.所以在需要将 (^result)中的^()去除来获取字符串时可以使用
sed 's/[\(\)\^]//g'
  • sed -i ‘s/${original}/${replacement}/g’ a.txt
    使用-i参数可以直接在文件中对原文件进行替换.所以当需要对文件中的字符串进行直接替换时可以使用:
sed -i  "s/${original_prop_name}/${new_prop_name}/g" ${allFiles}

在新的mac操作系统中必须指定文件的备份路径,需要填一添加一个空路径来消除报错:

sed -i '' "s/${original_prop_name}/${new_prop_name}/g" ${allFiles}

实现

命名实现文件为replace.sh


#!/bin/bash

    declare -a propertiesWithoutBlankLine;
    count=0;
    
function get_properties_from_source_file {
    local class_file=$1;
    allProperties=$(grep "@property.*" ${class_file})
    IFS_OLD=$IFS
    IFS=$'\n'
    
    for line in $allProperties; do
        is_comment=$(expr "$line" : '^ *\/\/.*')
        if [[ $is_comment -gt 0 ]] || [[ ${#line} -eq 0 ]];then
            echo "[blank or comment]"
        else
        # 正常的属性行
        # 1. 包含了显式声明block的属性
            contain_block_pattern="\(\^[[:alpha:]_]+\)\(([[:alpha:]]+[\* ][[:alpha:]_]+),?\)+"
            if [[ $line =~ ${contain_block_pattern} ]];then
            # 2. 获取block属性名称
            prop_name=$(echo $line | grep -o -E "\(\^[[:alpha:]_]+\)");
            prop_name=$(echo ${prop_name} | sed 's/[\(\)\^]//g')
            propertiesWithoutBlankLine[$count]=$prop_name;
            count=$(( count + 1 ));
#        echo "prop_name == ${prop_name} count=${count}"
            else
            # 普通属性
                prop_line=$(echo ${line} | sed 's/ +/ /g' )
                prop_name=$(echo $prop_line | grep -o -E "[ \*][[:alpha:]_]+ *;");
                prop_name=$(echo $prop_name | sed "s/[\*; ]//g")
                propertiesWithoutBlankLine[$count]=$prop_name;
                count=$(( count + 1 ));
            fi
        
        fi
    done
    IFS=$IFS_OLD
}

# 获取路径下的所有文件
function get_properties_from_source_dir {
    local l_classed_folder=$1;
    #递归查找文件中的所有实现文件
    allFiles=`find ${l_classed_folder} -name "*.[h|m]" `;
    IFS_OLD=$IFS
    IFS=$'\n'
    fileArr=($allFiles);

    IFS=$IFS_OLD;

    for(( i=0;i<${#fileArr[@]};i++ ))
    do
        class_file=${fileArr[i]};
        get_properties_from_source_file ${class_file}
    done
    
#        # 进行全局替换
    for (( i = 0;i < ${#propertiesWithoutBlankLine[@]}; i++ )); do
        original_prop_name=${propertiesWithoutBlankLine[i]};
        new_prop_name="prefix${original_prop_name}suffix";
        echo "${original_prop_name} == ${new_prop_name}"

        
        sed -i '' "s/${original_prop_name}/${new_prop_name}/g" ${allFiles}
        echo "正在处理属性 ${original_prop_name}....."
    done


}

get_properties_from_source_dir $1;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值