最近遇到一个小任务,大致如下:
- settings.json和defaults.xml里面有key和对应的设置值
对于settings.json中的key,先看下defaults.xml中有没有 如果有的话,看他们的设置值是否一致。
如果不一致,将defaults.xml中的值替换成settings.json中的值
其中json的一个文件格式如下:
Xml的文件格式如下:
写了一个小的脚本,将Json文件输出一个新的文件。使用正则,稍微需要注意开头和结尾的“[]”Key=Value的形式,代码如下:
if [ $# -ne 2 ]; then
echo "No file or no copyfile"
exit 1
fi
filename=$1
copyfile=$2
cp $filename $copyfile
if [ $? -eq 0 ];then
sed -i 's/\'['*'{'"key":"//g' $copyfile;
sed -i 's/"\,"value":/\=/g' $copyfile;
sed -i 's/'}'\,*']'*//g' $copyfile;
else
echo "Error!"
fi
执行,第一个参数为脚本,第二个为需处理文件,第三个为输出文件:
处理后的结果如下:
刚接触Shell,只会简单的,上面小任务还没有具体实现过程,仅供其他需求参考。
12.3日更新:
由于此次需要替换的key-value值不同处并不多,所以设想修改的思路如下:
- 将json文件提取成key=value的形式;
- 将xml文件提取成key=value形式;
- 按照json提取后文件的key的顺序,将xml按json的key值每行的顺序排序,输出排序后的文本;
- 通过Beyond Compare 4yond Compare 4软件,对比提取后的json文件和排序后的xml文件的异同,在原文件修改不同处;
实现的代码如下:
#传入4个参数,json文件,xml文件,输出的json文件,排序后的xml文件
#提取json字符串
#function do_extract_json(){
if [ $# -ne 4 ]; then
echo "No json_file_name or no new_json_file"
exit 1
fi
json_file_name=$1
new_json_file=$3
cp $json_file_name $new_json_file
if [ $? -eq 0 ];then
sed -i 's/\'['*'{'"key":"//g' $new_json_file;
sed -i 's/"\,"value":/\=/g' $new_json_file;
sed -i 's/'}'\,*']'*//g' $new_json_file;
sed -i 's/\"//g' $new_json_file;
else
echo "Error!"
fi
#}
#提取XMl字符串
#function do_extract_xml(){
if [ $# -ne 4 ]; then
echo "No xml_file_name or no new_xml_file"
exit 1
fi
xml_file_name=$2
grep -e "string name" -e "integer name" -e "bool name" $xml_file_name > new_xml_file
if [ $? -eq 0 ];then
sed -i -e 's/^[ \t]*<string[ ]//g' -e 's/^[ \t]*<integer[ ]//g' -e 's/^[ \t]*<bool[ ]//g' -e 's/name\=\"//g' new_xml_file; #处理开头空白 字符和 空格
sed -i 's/\"[ ]*//g' new_xml_file; #去除 ”空格
sed -i 's/translatable\=false//g' new_xml_file; #去除tran
sed -i -e 's/<\/string>//g' -e 's/<\/integer>//g' -e 's/<\/bool>//g' new_xml_file; #去除最后</xx>
sed -i 's/>/\=/g' new_xml_file; #换等号
else
echo "Error!"
fi
#}
#按json的key顺序排xml
#function do_sort_newxml(){
sort_xml_file_name=$4
for x in ` awk -F= '{print $1}' $new_json_file `
{
grep -w $x new_xml_file
} > $sort_xml_file_name
#}
执行:
输出对应的新txt文件。
软件对比输出的文档的效果如下:
最后修改不同处的源文件。
新手暂时没有想到更好的替换的实现方法,待记录。