Shell脚本:对比查找替换两个文件的不同的字符串值对

最近遇到一个小任务,大致如下:

  • 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值不同处并不多,所以设想修改的思路如下:

  1. 将json文件提取成key=value的形式;
  2. 将xml文件提取成key=value形式;
  3. 按照json提取后文件的key的顺序,将xml按json的key值每行的顺序排序,输出排序后的文本;
  4. 通过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文件。

软件对比输出的文档的效果如下:
在这里插入图片描述
最后修改不同处的源文件。

新手暂时没有想到更好的替换的实现方法,待记录。

发布了39 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43443900/article/details/103349938