昨天拜读了某位大牛的文章,发现有拼写错误;看样式估计是用Markdown写的,就试图用sed
给打补丁。
在此,总结一下所用到的方法和技术上的几个小坑。
Mac上的sed
Mac上的sed
跟常用的Linux发行版(如Ubuntu)上的sed不同;前者属于标准的POSIX sed
,后者属于增强型的GNU sed
。
增强 体现在哪里呢?支持的参数/选项不同,功能更强大……
重点在于 —— GNU sed
用的是我们所习惯的标准正则语法,而Mac自带的POSIX sed
不是!!!
e.g.
空白字符(空格/制表符)在GNU sed
中表示为\s
而在POSIX sed
中却表示为坑爹的[[:space:]]
果断换GNU-sed
;参考这里
brew install -y gnu-sed
echo "alias sed=gsed" >> ~/.zshrc
sed多行匹配
sed
本质上是个“流编辑器”,换句话说:是一行一行地处理文本的。
因此,并没有特别优雅的方法来解决这个问题。
stackexchange上的这篇文章提供了一种基于标签
的解决办法:
sed -i ':a;N;$!ba;s/\n/,/g' test.txt
解释一下:
:a
create a label via :a;N
append the current and next line to the pattern space via N$!ba
if we are before the last line, branch to the created label $!ba ($! means not to do it on the last line (as there should be one final newline)).s/\n/,/g
finally the substitution replaces every newline with a comma on the pattern space (which is the whole file).
colordiff -u
Mac上自带的diff
样式比较丑,可以换成colordiff
;另外,开-u
选项可以渲染成类似git diff
的样式。ref http://qiita.com/catatsuy/items/8bafef2a60762a1c9f0f
brew install colordiff
echo "alias diff=colordiff -u" >> ~/.zshrc
脚本
OK,有了上述基础;可以写脚本了。
#!/bin/bash
gsed -i.backup \
-e "s/电活/电话/g" \
-Ee ":a;N;$bash;s/使\s{2,}\n\s*用/使用/g" \
-e "s/使<br ?\/?>用/使用/g" \
$1
echo "========== diff START =========="
colordiff -u $1.backup $1
echo "========== diff END =========="
echo "========== you can run 'rm -rf $1.backup' after confirm it =========="
- 看起来比较奇怪的那一行是在处理“两个空格加一个回车”的模式,在markdown中这个会被转成
<br />
gsed
中的-i
选项是直接跟后缀名的,中间不用加空格- 选项
-E
是打开高级扩展;有时候要加上(在zsh
中直接用好像又不支持,很奇怪) $!ba
不知为何自动变成了$bash
;但是不影响结果(而且,直接写$!ba
反而会出错)
基于wget
做自动运行
把补丁脚本push到网上,然后把下列命令发给作者即可。
这里我用的是/dev/stdin
,应该也可以用xargs
之类的方法吧。初步试了试,好像比较麻烦,就算了。
wget http://koyo922.github.io/share/patch_time_friend.sh -O- | bash /dev/stdin <your_source_file.md>