安卓屏幕适配从sdp还原dp(批量处理)
#!/bin/bash
# 检查是否提供了目录路径作为参数
if [ $# -eq 0 ]; then
echo "请提供一个目录路径作为参数。"
exit 1
fi
# 获取指定的目录路径
target_dir="$1"
# 检查目录是否存在
if [ ! -d "$target_dir" ]; then
echo "指定的目录 $target_dir 不存在。"
exit 1
fi
# 使用 find 命令递归查找指定目录下的所有 XML 文件
find "$target_dir" -type f -name "*.xml" | while read -r xml_file; do
# 检查文件最后一行是否为空行,若不是则添加空行
last_char=$(tail -c 1 "$xml_file")
if [ -n "$last_char" ]; then
echo >> "$xml_file"
fi
# 创建临时文件用于存储修改后的内容
temp_file="${xml_file}.tmp"
# 逐行读取 XML 文件内容
while IFS= read -r line; do
# 查找双引号内以 "@dimen/_" 开头,中间是数字,并以 "sdp" 结尾的字符串
while [[ $line =~ \"@dimen/_(.*)sdp\" ]]; do
match="${BASH_REMATCH[0]}"
number_str="${BASH_REMATCH[1]}"
# 去除可能存在的 "@dimen/_minus" 中的 "minus" 前缀
number_str="${number_str#minus}"
# 检查提取的部分是否为纯数字
if [[ $number_str =~ ^[0-9]+$ ]]; then
number=$number_str
if [ "$number" -eq 1 ]; then
new_number=$((number - 1))
elif [ "$number" -gt 1 ] && [ "$number" -le 8 ]; then
new_number=$((number + 2))
elif [ "$number" -gt 8 ]; then
new_number=$((number + 10))
fi
# 生成替换后的字符串
replacement="${new_number}dip"
# 将匹配到的字符串替换为新字符串
line="${line//$match/\"$replacement\"}"
fi
done
# 将修改后的行写入临时文件
echo "$line" >> "$temp_file"
done < "$xml_file"
# 用临时文件替换原文件
mv "$temp_file" "$xml_file"
done
echo "处理完成。"
使用步骤
- 保存脚本:把上述脚本保存成一个文件,比如 process_xml_recursive.sh。
- 赋予执行权限:在终端里运行以下命令,给脚本添加执行权限:
chmod +x process_xml_recursive.sh
- 运行脚本:在终端中执行脚本,并传入要处理的目录路径,示例如下:
./process_xml_recursive.sh /your/target/directory
脚本解释
1.参数与目录检查:
- 脚本会先检查是否提供了目录路径作为参数,如果没提供,就输出提示信息并退出。
- 接着检查指定的目录是否存在,若不存在则输出错误信息并退出。
2.递归查找 XML 文件:使用 find 命令递归查找指定目录及其子目录下的所有 XML 文件。
3.处理每个 XML 文件:
- 检查并添加空行:通过 tail -c 1 命令获取文件的最后一个字符,若不为空就添加一个空行。
- 创建临时文件:创建一个临时文件来存放修改后的内容,防止直接修改原文件导致数据丢失。
-
逐行处理文件内容:
- 使用正则表达式 "@dimen/_(.*)sdp" 查找双引号内符合条件的字符串。
- 提取中间的数字部分,并去除可能的 "minus" 前缀。
- 根据数字的不同情况进行计算:等于 1 时减 1;大于 1 且小于等于 8 时加 2;大于 8 时加 10。
- 生成替换字符串,去除 "@dimen/_" 前缀和 "sdp" 后缀,只保留计算后的数字和 "dip" 后缀。
- 将原匹配字符串替换为新字符串,并把修改后的行写入临时文件。
- 更新文件:使用 mv 命令用临时文件替换原文件。
注意事项
- 此脚本会直接修改原 XML 文件,建议运行前对重要文件进行备份。
- 脚本假设 XML 文件中的字符串都用双引号包裹,若存在单引号等情况,需调整正则表达式。