遞歸遍歷指定目錄及其子目錄下的所有 XML 文件,從dp和dip適配為sdp
#!/bin/bash
# 檢查是否傳入了目錄參數(shù)
if [ $# -eq 0 ]; then
echo "請?zhí)峁┮粋€目錄路徑作為參數(shù)。"
exit 1
fi
target_dir="$1"
# 檢查目錄是否存在
if [ ! -d "$target_dir" ]; then
echo "指定的目錄 $target_dir 不存在。"
exit 1
fi
# 遞歸查找所有 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
# 創(chuàng)建臨時文件用于存放處理后的內(nèi)容
temp_file="${xml_file}.tmp"
# 逐行處理 XML 文件
while IFS= read -r line; do
# 查找雙引號內(nèi)數(shù)字開頭且以 dp 或 dip 結(jié)尾的字符串(忽略 0dp 和 0dip)
while [[ $line =~ \"([1-9][0-9]*)(dp|dip)\" ]]; do
match="${BASH_REMATCH[0]}"
number="${BASH_REMATCH[1]}"
unit="${BASH_REMATCH[2]}"
if [ "$number" -le 10 ]; then
new_number=$((number - 2))
else
new_number=$((number - 10))
fi
if [ "$new_number" -gt 0 ]; then
replacement="@dimen/_${new_number}sdp"
elif [ "$new_number" -lt 0 ]; then
abs_new_number=$((new_number * -1))
replacement="@dimen/_minus${abs_new_number}sdp"
else
replacement="@dimen/_1sdp"
fi
line="${line//$match/\"$replacement\"}"
done
echo "$line" >> "$temp_file"
done < "$xml_file"
# 用臨時文件替換原文件
mv "$temp_file" "$xml_file"
done
echo "處理完成。"
使用說明
- 保存腳本:將上述腳本保存為一個文件,例如 process_xml.sh。
- 賦予執(zhí)行權(quán)限:在終端中運(yùn)行以下命令為腳本添加執(zhí)行權(quán)限:
chmod +x process_xml.sh
- 執(zhí)行腳本:指定要處理的目錄路徑來運(yùn)行腳本,示例如下:
./process_xml.sh /your/target/directory
腳本解釋
- 參數(shù)檢查:腳本會檢查是否傳入了目錄參數(shù),以及該目錄是否存在。若不滿足條件,會輸出相應(yīng)的錯誤信息并退出。
- 遞歸查找 XML 文件:使用 find 命令遞歸查找指定目錄及其子目錄下的所有 XML 文件。
-
處理每個 XML 文件:
- 檢查并添加空行:通過 tail -c 1 命令獲取文件的最后一個字符,若不為空則添加一個空行。
- 逐行處理內(nèi)容:使用正則表達(dá)式 "([1-9][0-9]*)(dp|dip)" 查找雙引號內(nèi)數(shù)字開頭且以 dp 或 dip 結(jié)尾的字符串(忽略 0dp 和 0dip)。
- 數(shù)字處理:根據(jù)數(shù)字大小進(jìn)行不同的減法操作(小于等于 10 減 2,大于 10 減 10)。
- 結(jié)果處理:根據(jù)減法結(jié)果生成不同的替換字符串。
- 替換字符串:將匹配到的字符串替換為處理后的字符串。
- 更新文件:將處理后的內(nèi)容逐行寫入臨時文件,最后用臨時文件替換原文件。
注意事項(xiàng)
- 此腳本會直接修改原 XML 文件,建議在運(yùn)行前備份重要數(shù)據(jù)。
- 腳本假設(shè) XML 文件中的字符串使用雙引號包裹,若存在其他情況,可能需要調(diào)整正則表達(dá)式。