用shell批量改变打错标签的名字(打标签是一生之敌)

打标签真是一生之敌:这两天打了1500张标签,交了才发现所有的命名都没大写(emo)但是再打一遍也是不大可能的,于是组长给了一个建议:写一个脚本来修改所有的命名。我能怎么办,写呗~


由于打标签生成的json文件中需要修改的地方只有blue5之类的字符,所以

开始学习sed命令
1、概念

sed全称是:Stream EDitor(流编辑器)
Linux sed 命令是利用脚本来处理文本文件,sed 可依照脚本的指令来处理、编辑文本文件。Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

2、基本命令
 -n, --quiet, --silent    取消自动打印模式空间
 -e 脚本, --expression=脚本   添加“脚本”到程序的运行列表
 -f 脚本文件, --file=脚本文件  添加“脚本文件”到程序的运行列表
 --follow-symlinks    直接修改文件时跟随软链接
 -i[扩展名], --in-place[=扩展名]    直接修改文件(如果指定扩展名就备份文件)
 -l N, --line-length=N   指定“l”命令的换行期望长度
 --posix  关闭所有 GNU 扩展
 -r, --regexp-extended  在脚本中使用扩展正则表达式
 -s, --separate  将输入文件视为各个独立的文件而不是一个长的连续输入
 -u, --unbuffered  从输入文件读取最少的数据,更频繁的刷新输出
 --help     打印帮助并退出
 --version  输出版本信息并退出
 -a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
 -c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
 -d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
 -i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
 -p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
 -s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法

在这次问题中,主要是用到【-s】,也就是取代

只修改匹配到的第一个字符串

sed 's/原字符串/替换字符串/'

但是由于一张图片打的标签不止一个,所以得全文替换

sed 's/原字符串/替换字符串/g'
# 在末尾加g替换每一个匹配的关键字,否则只替换每行的第一个

在此基础上,写出了第一个版本:

第一版:
#!/bin/bash
cd /home/computer/shell/3508-5007new/		
#这里是放着错误lable的json文件的地方,可以根据自己的情况改变
a=3508
while [ $a -lt 5008 ]		
do
	sed -i 's/blue0/Blue0/g' $a.json 	
	sed -i 's/blue5/Blue5/g' $a.json
	sed -i 's/red5/Red5/g' $a.json 
	sed -i 's/red0/Red0/g' $a.json
	sed -i 's/blue2/Blue2/g' $a.json  
	((a=a+1))
done

在这里插入图片描述
在这里插入图片描述

但是这一版的问题也很明显,我们可以知道json文件中有一个imgdata中有生成的很多字符表示图片信息,虽然组长说只有很小很小的概率会出现我刚好起的lable名,但还是存在风险。

第二版:

在继续观察后我发现我的json文件中因为最多只有两个标签,也就是说,lable这个参数只存在于第6行和第30行,而我的所有json文件中,这两行都还没到imgdata,也即是说:如果我只替换这两行中间的字符,就不会影响到imgdata

在这里插入图片描述

#!/bin/bash
cd /home/computer/shell/3508-5007new/		
#这里是放着错误lable的json文件的地方,可以根据自己的情况改变
a=3508
while [ $a -lt 5008 ]		
do
	sed -i '6,30s/blue0/Blue0/g' $a.json 	
	sed -i '6,30s/blue5/Blue5/g' $a.json
	sed -i '6,30s/red5/Red5/g' $a.json 
	sed -i '6,30s/red0/Red0/g' $a.json
	sed -i '6,30s/blue2/Blue2/g' $a.json  
	((a=a+1))
done

这个代码可以解决我的问题,不用再打1500张图片了,但是又想到这次是因为刚好最多就两个标签,万一下次有三个标签,那这个脚本就不能用了,于是又开始想第三版

第三版:

组长的提示下,我想到如果替换"blue2"这整个带着双引号的字符串,imgdata不可能存在这种字符,这样大概就可以成功解决了。于是尝试:

但是字符串里面含有双引号
在这个时候可以用#当做分隔符,就变成
sed -i "s#原字符串#c替换字符串#g" file
#!/bin/bash
cd /home/computer/shell/3508-5007new/		
#这里是放着错误lable的json文件的地方,可以根据自己的情况改变

a=3508
#这个是我的json文件的第一个文件:3508.json

while [ $a -lt 5008 ]		#这个5008是我的json文件的最后一个文件名+1:5007.json
do
	sed -i 's#"blue0"#"Blue0"#' $a.json 	#第一个blue0是我起错的名字,可以根据自己的情况改
	sed -i 's#"blue5"#"Blue5"#' $a.json
	sed -i 's#"red5"#"Red5"#' $a.json 	#这些都是我起错名字的个数,要是你还有其他的,可以接着加
	sed -i 's#"red0"#"Red0"#' $a.json
	sed -i 's#"blue2"#"Blue2"#' $a.json  
	((a=a+1))

done

大功告成,完结撒花~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值