准备
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;