bash
Task
有一天,我接到了一个需求 : 将文字‘代金券’改为‘抵用券’。
How to do it
git grep '代金券' | awk 'BEGIN {FS=":"} {print $1}' | sort | uniq | xargs vim
接着,来到了VIM中,
:argdo %s/代金券/抵用券/ge
:wa
Specifically
(1) git grep '代金券' 输出的内容是这样的:
configuration/top10/event1.config.php: "title": "价值100元的捞济码头代金劵1张,免费提供WiFi。"
(2) awk 'BEGIN {FS=":"} {print $1}' awk默认用空格,将每一行文本分割成若干个字段,我通过“:”分割,获取第一个字段,即文件名字。
awk 是一个非常棒的数据处理工具,将一行分成若干个字段来处理。有3个内建变量,NF:每行字段数,NR:当前行号,FS:分隔符,可通过设置他们来控制字段的获取 {}设定想要对数据进行的操作,通常与print连用
(3) uniq 过滤重复的记录,只保留一行。
uniq 过滤重复,-c参数可进行计数。可以统计每个记录出现的次数
(4) xargs vim 将文件名作为参数,传给VIM,一起编辑
xargs读入数据,通过分隔符分割成参数,传递到后面的命令中。它存在的原因是:有些命令不支持管线,可通过它来提供该种命令的参数
(5) argdo 改变多个文件
:argdo %s/xxx/xxx/g 可以结合替换命令对所有文件的内容执行替换。但是它有些问题,如果有的文件没有找到替换的pattern,它就会报错。可通过/ge来'镇压报错'。
At the End
对Shell一直望而生畏,对它的应用也只停留在呵欠连天的IBM课堂上。后来做前端,以为与Shell的世界可以绝缘了,偷笑着奔向Sublime的怀抱,突然,来到了MT的世界。
但行好事,莫问前程 开始的时候,MT的世界充满了我不熟悉的东西,VIM,Git,Shell ... 最初我低着头,不问方向,只想着我得尽快学会,并不知道这些东西‘到底’好在哪里,为什么是它而不是其他。
凡事都有个‘但是’ 但是,透过这个需求,用很简单的命令,处理了大量重复的事情。我开始领略到了一点点shell的威风。
学习之路,未完待续
本篇参考
Tools, 鸟哥的Linux私房菜
Website, VIMCASTS.org Using :argdo to change multiple files
阮一峰, 处理Apache日志的Bash脚本