打标签真是一生之敌:这两天打了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
大功告成,完结撒花~