XML文件含指定字符串行的整数转固定长度浮点数问题
问题描述
- 业务需求:将系统接收的特定XML格式数据中,
code:value的纯整数值替换为固定9位小数格式(例如25转为25.000000000) - 现有问题:原sed命令
sed -i 's/\(ordinary.*"[0-9]\+\)/\1.000000000/'会在文件被监控程序重复触发修改时,给已格式化的小数重复添加小数位,导致出现25.000000000.000000000的错误格式
解决方案
改进版sed命令
核心是精准匹配纯整数值的场景,避免对已格式化的小数重复操作:
sed -i 's/\(ordinary.*code:value="\)\([0-9]\+\)\("\)/\1\2.000000000\3/' 目标文件名
原理
正则精准匹配ordinary开头、code:value="后接纯整数、再以"结尾的片段,仅对这类片段添加固定小数位,已包含小数点的数值不会被匹配到。
awk处理方案
通过awk的匹配和分组功能,明确筛选纯整数进行格式化:
awk '/ordinary.*code:value="[0-9]+"/ { match($0, /(ordinary.*code:value=")([0-9]+)(")/, arr) $0 = arr[1] arr[2] ".000000000" arr[3] }1' 目标文件名 > 临时文件 && mv 临时文件 目标文件名
原理
仅对包含纯整数code:value的行进行处理,提取整数部分后拼接固定小数位,其他行保持不变。
Shell脚本逐行处理
如果需要更灵活的扩展逻辑,可使用以下脚本:
#!/bin/bash if [ $# -ne 1 ]; then echo "使用方法: $0 <目标文件>" exit 1 fi FILE="$1" TEMP_FILE=$(mktemp) while IFS= read -r line; do # 匹配纯整数的code:value片段 if [[ "$line" =~ (ordinary.*code:value=")([0-9]+)(") ]]; then line="${BASH_REMATCH[1]}${BASH_REMATCH[2]}.000000000${BASH_REMATCH[3]}" fi echo "$line" >> "$TEMP_FILE" done < "$FILE" mv "$TEMP_FILE" "$FILE" echo "处理完成"
使用方法
- 将脚本保存为
convert_int_to_decimal.sh - 赋予执行权限:
chmod +x convert_int_to_decimal.sh - 运行脚本:
./convert_int_to_decimal.sh 目标文件名
内容的提问来源于stack exchange,提问作者devopsDude
相关产品推荐
相关产品推荐

