shell对xml文件操作(更新属性值+以当前日期重命名)

本文介绍了一个Shell脚本,用于更新XML文件中的特定属性值,并按当前日期重命名文件。脚本首先查找目标XML文件,然后使用sed命令更新属性值,最后以当前日期作为前缀重命名所有XML文件。

shell对xml文件操作(更新属性值+以当前日期重命名)

xml示例文件

本文代码将以下面文件名为Crm运行信息_20190222103001.xml 的文件为例做说明。

<?xml version="1.0" encoding="UTF-8"?>
<!-- Base_station_ICT -->
<CrmRunningInfoRecordList>
<CrmRunningInfoRecord>
 <CRMNETUNIT>5</CRMNETUNIT>
 <RLSETUPNUM>1633</RLSETUPNUM>
 <JQRLSETUPNUM>2388</JQRLSETUPNUM>
 <RLSETUPSUCCESSNUM>601</RLSETUPSUCCESSNUM>
 <RLSETUPFAILNUM>1032</RLSETUPFAILNUM>
 <JQRLSETUPSUCCESSNUM>1426</JQRLSETUPSUCCESSNUM>
 <JQRLSETUPFAILNUM>962</JQRLSETUPFAILNUM>
 <REPORTTIME>2019-01-10 14:30:01</REPORTTIME>
</CrmRunningInfoRecord>
</CrmRunningInfoRecordList>

该文件所属目录为 /home/perf/perf_files/models/

修改xml文件的shell脚本

#!/bin/sh

change_CRM_precent()
{
		# 找出当前Crm运行信息_*.xml文件存放的绝对路径
		# 【例】输出/home/perf/perf_files/models/CRM运行信息_20190222103001.xml
        CrmFile=$(ls /home/perf/perf_files/models/Crm运行信息_*.xml)
        
        # 读xml文件,对属性值做修改
        # sed -i "/旧值/c \新值" 文件路径
        RLSuccSum=$(cat "$CrmFile" | grep "<RLSETUPSUCCESSNUM>" |awk -F ">" '{print $2}' |awk -F "<" '{print $1}')
        RLFailSum=$(cat "$CrmFile" | grep "<RLSETUPFAILNUM>" |awk -F ">" '{print $2}' |awk -F "<" '{print $1}')
        RLSuccSumNew=$(($RLSuccSum + 1))
        RLFailSumNew=$(($RLFailSum + 3))
        RLSumNew=$(( $RLSuccSumNew + $RLFailSumNew ))
        sed -i "/<RLSETUPNUM>/c \ <RLSETUPNUM>$RLSumNew</RLSETUPNUM>" $CrmFile
        sed -i "/<RLSETUPSUCCESSNUM>/c \ <RLSETUPSUCCESSNUM>$RLSuccSumNew</RLSETUPSUCCESSNUM>" $CrmFile
        sed -i "/<RLSETUPFAILNUM>/c \ <RLSETUPFAILNUM>$RLFailSumNew</RLSETUPFAILNUM>" $CrmFile

        JQRLSuccSum=$(cat "$CrmFile" | grep "<JQRLSETUPSUCCESSNUM>" |awk -F ">" '{print $2}' |awk -F "<" '{print $1}')
        JQRLFailSum=$(cat "$CrmFile" | grep "<JQRLSETUPFAILNUM>" |awk -F ">" '{print $2}' |awk -F "<" '{print $1}')
        JQRLSuccSumNew=$(($JQRLSuccSum + 4))
        JQRLFailSumNew=$(($JQRLFailSum + 2))
        JQRLSumNew=$(( $JQRLSuccSumNew + $JQRLFailSumNew ))
        sed -i "/<JQRLSETUPNUM>/c \ <JQRLSETUPNUM>$JQRLSumNew</JQRLSETUPNUM>" $CrmFile
        sed -i "/<JQRLSETUPSUCCESSNUM>/c \ <JQRLSETUPSUCCESSNUM>$JQRLSuccSumNew</JQRLSETUPSUCCESSNUM>" $CrmFile
        sed -i "/<JQRLSETUPFAILNUM>/c \ <JQRLSETUPFAILNUM>$JQRLFailSumNew</JQRLSETUPFAILNUM>" $CrmFile
        CrmUnit=$(cat "$CrmFile" | grep "<CRMNETUNIT>" |awk -F ">" '{print $2}' |awk -F "<" '{print $1}')
        CrmUnitNew=$(( ($CrmUnit + 1)%10 ))
        if [ $CrmUnitNew -eq 0 ]; then
            CrmUnitNew=10
        fi
        sed -i "/<CRMNETUNIT>/c \ <CRMNETUNIT>$CrmUnitNew</CRMNETUNIT>" $CrmFile
}

ModelPath=/home/perf/perf_files/models/

#  ls ${ModelPath}DPU*.xml【输出】/home/perf/perf_files/models/DPU流量统计_20190222103001.xml
# 【说明】cut -b 是以字节分割,其中中文字符占4个字节,英文字符占1个字节
# 【输出】OldTime = 20190222103001
OldTime=$(ls ${ModelPath}DPU*.xml | cut -b 46-59)

# 【输出】CurTime = 20190222110447
CurTime=$(date "+%Y%m%d%H%M%S")
# 【输出】FilePath = 20190222  -- 以当前日期(年月日)命名新目录
FilePath=/home/perf/perf_files/${CurTime:0:8}/

if [ ! -d "$FilePath" ]; then
        mkdir -p $FilePath
fi

# 执行shell自定义函数
change_CRM_precent

# 正则匹配项
# 4个字符是0-9的数字-2个字符是0-9的数字 2个字符是0-9的数字:2个字符是0-9的数字:2个字符是0-9的数字
RE="[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}"
TT=$(date "+%Y-%m-%d %H:%M:%S")

# 给各xml按照日期尾缀命名
sed -i "s/$RE/$TT/g" ${ModelPath}*.xml 
rename "$OldTime" "$CurTime" ${ModelPath}*.xml
cp ${ModelPath}*.xml $FilePath

echo "End ./change_models.sh to modify xml!"

代码中的几个关键点

  1. shell的模糊匹配 * ls /home/perf/perf_files/models/Crm运行信息_*.xml
  2. 更改xml属性值 grepawk RLSuccSum= ( c a t &quot; (cat &quot; (cat"CrmFile" | grep “” |awk -F “>” ‘{print $2}’ |awk -F “<” ‘{print $1}’)
  3. 直接修改读取的文件内容 sed -i sed -i “/原字符串/c \新字符串” 文件路径
  4. cut -b 是以字节分割,其中中文字符占4个字节,英文字符占1个字节
  5. 字符串变量分割: ${CurTime:0:8}
  6. 给各xml按照日期尾缀命名:
OldTime=$(ls ${ModelPath}DPU*.xml | cut -b 46-59)
CurTime=$(date "+%Y%m%d%H%M%S")

sed -i "s/$RE/$TT/g" ${ModelPath}*.xml 
rename "$OldTime" "$CurTime" ${ModelPath}*.xml
cp ${ModelPath}*.xml $FilePath

梦想还是要有的,万一实现了呢~ヾ(◍°∇°◍)ノ゙~~~~~~~~
<think>我们正在解决一个关于Android系统代码中缺少`stat_sys_volte.xml`文件的问题。根据用户提供的信息,我们知道: - 用户之前的问题是关于VoLTE矢量图的,我们给出了资源位置和获取方法。 - 现在用户发现系统中缺少`stat_sys_volte.xml`文件,需要解决。 根据引用内容,我们注意到: - 引用[1]提到了一个信号图标的位图文件,但它是通过`<bitmap>`标签引用的,并不是矢量图。 - 引用[2]和[3]提到了`StatusBarMobileView.java`,这个类负责加载移动信号图标(如4G信号图标和信号柱)。 在Android系统中,VoLTE图标通常位于`frameworks/base/packages/SystemUI/res/drawable/`目录下。如果该文件缺失,我们可以采取以下步骤解决: ### 步骤1:确认文件是否真的缺失 首先,我们需要在AOSP代码中确认该文件是否存在。我们可以通过以下方式: 1. 在AOSP源码目录中查找: ```bash find . -name stat_sys_volte.xml ``` 2. 或者,在在线AOSP仓库中查找:访问[https://android.googlesource.com](https://android.googlesource.com)并导航到`frameworks/base/packages/SystemUI/res/drawable/`目录,查看是否有`stat_sys_volte.xml`。 ### 步骤2:如果确实缺失,考虑添加自定义文件 如果确认该文件在AOSP中不存在(可能是因为特定厂商或Android版本差异),我们可以自己创建一个`stat_sys_volte.xml`文件。 #### 创建自定义VoLTE矢量图 我们可以参考标准VoLTE图标的设计,创建一个矢量图。例如: ```xml <!-- 文件路径:frameworks/base/packages/SystemUI/res/drawable/stat_sys_volte.xml --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24" android:tint="?android:attr/colorControlNormal"> <!-- 信号柱 --> <path android:fillColor="#FF000000" android:pathData="M3,14 L5,14 L5,18 L3,18 Z" /> <path android:fillColor="#FF000000" android:pathData="M7,11 L9,11 L9,18 L7,18 Z" /> <path android:fillColor="#FF000000" android:pathData="M11,8 L13,8 L13,18 L11,18 Z" /> <path android:fillColor="#FF000000" android:pathData="M15,5 L17,5 L17,18 L15,18 Z" /> <!-- VoLTE文字标识(简化为V和L的组合) --> <path android:fillColor="#FF000000" android:pathData="M19,7 L19,16 L21,16 L21,7 Z" /> <path android:fillColor="#FF000000" android:pathData="M19,7 L21,7 L21,9 L19,9 Z" /> </vector> ``` ### 步骤3:在代码中引用该图标 在状态栏信号图标的控制逻辑中,会使用到这个资源。通常,代码会通过`R.drawable.stat_sys_volte`来引用。例如,在`StatusBarMobileView.java`(如引用[2][^2]和[3][^3]提到的)中,可能会根据网络类型和状态来设置图标。 如果我们的设备支持VoLTE,那么当VoLTE激活时,系统应该显示这个图标。因此,我们需要确保在显示逻辑中正确地引用了这个资源。 ### 步骤4:重新编译SystemUI 添加或修改资源后,需要重新编译SystemUI模块: ```bash make SystemUI ``` ### 步骤5:处理可能遇到的兼容性问题 如果设备是特定厂商(如MTK)定制的,可能需要查看厂商的代码路径(如引用[3][^3]中提到的`vendor/mediatek/proprietary/packages/apps/SystemUI/`)。有可能厂商使用了不同的资源文件命名,或者将VoLTE图标集成到了其他图标中(比如和信号图标合并)。 ### 替代方案:检查是否有其他命名的资源 有时,VoLTE图标可能被命名为其他名字,例如: - `stat_sys_volte_icon.xml` - `ic_volte.xml` 我们可以搜索整个代码库,看是否有类似功能的图标,然后将其重命名或复制为`stat_sys_volte.xml`。 ### 总结解决方案 1. **确认缺失**:在AOSP代码库中查找`stat_sys_volte.xml`,确认是否真的缺失。 2. **创建文件**:如果缺失,在`frameworks/base/packages/SystemUI/res/drawable/`目录下创建该文件,内容为自定义的VoLTE矢量图。 3. **代码检查**:检查`StatusBarMobileView.java`等文件,确保在显示VoLTE图标时引用了`R.drawable.stat_sys_volte`。 4. **重新编译**:重新编译SystemUI模块并刷机测试。 5. **厂商适配**:如果是厂商定制系统,检查厂商的SystemUI资源目录,可能需要将文件添加到对应位置。 ### 相关问题 1. **如何修改VoLTE图标的颜色?** 在矢量图文件中修改`android:fillColor`属性值,或者通过`android:tint`属性动态着色[^1]。 2. **VoLTE图标不显示的可能原因有哪些?** 除了资源文件缺失,还可能是运营商配置未启用VoLTE图标显示(通过`CarrierConfig`配置),或者状态栏图标管理逻辑未触发。 3. **如何调试状态栏图标显示问题?** 可以通过`adb shell dumpsys activity service com.android.systemui`命令查看SystemUI状态,特别是信号相关的状态。 4. **Android不同版本中VoLTE图标资源位置是否有变化?** 在Android 8.0及以后,VoLTE图标通常为矢量图,位于SystemUI的drawable目录;而之前版本可能使用位图,路径可能不同。 5. **如何为特定运营商定制VoLTE图标?** 可以通过覆盖`CarrierConfig`中的配置项,指定不同的图标资源。 [^1]: 矢量图可以通过修改填充颜色或使用tint属性来改变颜色。 [^2]: `StatusBarMobileView`负责加载移动网络状态图标。 [^3]: 厂商定制的SystemUI可能位于`vendor`目录下。</think>在 Android 系统代码中解决缺少 `stat_sys_volte.xml` 文件的问题,需要分步骤处理: ### 一、问题定位与原因分析 1. **系统默认位置检查** 首先确认标准位置是否存在该文件: ```bash # 核心路径检查 ls frameworks/base/packages/SystemUI/res/drawable/stat_sys_volte.xml # 扩展路径检查(部分厂商定制) ls vendor/*/packages/apps/SystemUI/res/drawable/stat_sys_volte.xml ``` 如果不存在,可能是: - 厂商定制化移除(常见于 MTK/高通平台) - Android 版本兼容问题(Oreo 后强制使用矢量图) - 代码配置错误禁用 VoLTE 显示 2. **代码引用追踪** 根据引用 [2][^2] 和 [3][^3],检查 `StatusBarMobileView.java` 的资源加载逻辑: ```java // 查看图标加载代码段 public void updateState(State state) { if (state.volteId > 0) { // 关键:查找资源ID映射关系 mVOLTEView.setImageResource(state.volteId); } } ``` 资源 ID 通常定义在 `R.drawable.stat_sys_volte` --- ### 二、解决方案 #### 方案 1:添加标准矢量图(推荐) 1. 在 `frameworks/base/packages/SystemUI/res/drawable/` 创建文件 ```xml <!-- stat_sys_volte.xml --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="16dp" android:height="16dp" android:viewportWidth="24" android:viewportHeight="24"> <!-- 信号柱 --> <path android:fillColor="#FF0B60BC" android:pathData="M2,12 L4,12 L4,20 L2,20 Z"/> <path android:fillColor="#FF0B60BC" android:pathData="M6,8 L8,8 L8,20 L6,20 Z"/> <!-- VoLTE 标识 --> <path android:fillColor="#FF0B60BC" android:pathData="M10,4 L12,4 L12,9 L10,9 Z M14,4 L16,4 L16,9 L14,9 Z"/> </vector> ``` 2. 在 `StatusBarMobileView.java` 中确认资源引用 ```java // 确保状态更新逻辑正确 state.volteId = R.drawable.stat_sys_volte; // 引用[2][^2] ``` #### 方案 2:厂商适配层添加 若为 MTK 平台(引用 [3][^3]): ```bash # 在厂商目录创建文件 mkdir -p vendor/mediatek/proprietary/packages/apps/SystemUI/res/drawable/ vi vendor/.../stat_sys_volte.xml # 添加上述矢量图内容 ``` 同时在 `vendor/mediatek/proprietary/packages/apps/SystemUI/res/values/ids.xml` 添加: ```xml <item type="drawable" name="stat_sys_volte">@drawable/stat_sys_volte</item> ``` #### 方案 3:动态生成替代方案 在 `StatusBarMobileView.java` 中添加备用逻辑: ```java // 引用[2][^2] 修改状态更新方法 public void updateState(State state) { if (state.volteId == 0) { // 资源缺失时 // 创建动态矢量图 VectorDrawableCompat volteIcon = VectorDrawableCompat.create( getResources(), R.drawable.ic_backup_volte, // 备用资源 getContext().getTheme() ); mVOLTEView.setImageDrawable(volteIcon); } else { mVOLTEView.setImageResource(state.volteId); } } ``` --- ### 三、验证与调试 1. **编译检查** ```bash make SystemUI # 单独编译模块 mmma frameworks/base/packages/SystemUI ``` 2. **运行时验证** ```bash adb shell dumpsys activity service com.android.systemui | grep "Volte" # 观察状态栏图标加载日志 ``` 3. **资源覆盖测试** 通过 `adb` 强制刷新资源: ```bash adb shell am broadcast -a android.intent.action.LOCALE_CHANGED ``` --- ### 四、兼容性处理 | Android 版本 | 处理要点 | |--------------|----------------------------------| | Android 7.x | 检查 `stat_sys_volte.png` 位图 | | Android 8.0+ | 必须使用矢量图(XML) | | Android 12+ | 需适配 Material You 动态取色系统 | > **提示**:从 Android 10 开始,信号图标渲染改由 `StatusBarIconController` 统一管理,需同步检查 `IconManager.java` 中的图标映射逻辑[^1]。 --- ### 相关问题 1. **如何为不同运营商定制 VoLTE 图标?** 可通过 `CarrierConfigManager` 配置运营商专属图标资源映射[^1]。 2. **VoLTE 图标不显示但功能正常如何排查?** 检查 `config_display_volte_icon` 配置值: ```bash adb shell settings get global volte_icon_display_policy ``` 3. **矢量图渲染性能如何优化?** 使用 `android:autoMirrored="true"` 减少 RTL 布局计算量(参考引用 [1][^1])。 4. **如何测试 VoLTE 图标在不同DPI下的显示?** 在 `drawable-xxxhdpi` 等目录放置测试资源,使用 `adb shell wm density` 切换DPI。 5. **系统签名权限问题导致资源加载失败怎么办?** 在 `AndroidManifest.xml` 添加: ```xml <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> ``` [^1]: 矢量图资源需包含在系统签名应用中 [^2]: `StatusBarMobileView` 负责加载信号状态图标 [^3]: MTK 平台定制化实现可能位于 vendor 目录
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值