由hexo-math 引起的sed 的多行处理问题=。=
之所以要做sed的多行处理,是因为hexo在渲染公式的时候对$和$$并不是很友好,很多用这两个符号包出来的公式都没法正确处理。但是用 $$` 就可以很好地渲染。但是问题在于大部分支持latex的markdown编辑器都不支持后一种记号,所以只能在写完之后人工替换。这样的情况下公式一多就很痛苦,但是我又懒得去写代码处理,所以就去研究了一下sed(妈蛋现在看来看sed的时间我都能写10个替换的代码了(╯′□`)╯ ┫:·'∵:.┻┻:·'.:┣∵·:. ┳┳☆)
言归正传,我们来看我们要匹配的东西。其实这种东西用正则写很简单,就是`\$[^$]*\$`这就可以处理单个的问题了,当然前提是我们先把多行的公式处理了。直接上代码吧:
`gsed -i ' /\$\$/ { s/\$\$/$/;:a; N; /\$\$/! ba; s/\$\$/$/};s/\(\$\)\([^$]*\)\(\$\)/$\2$/g ' sourcefile
一般来说多行处理的sed脚本基本都长这个样子。
大括号之前有一个/\$\$/
,表示当前处理语句的范围。一般表示为 /a/,/b/
,前面一个是开始地址,后面一个是结束地址,不过结束地址可以省略
主要说一下第一个大括号里面的东西:
- 第一句没啥好说的,替换 $$;
:a
类似于c中的label;N
表示将当前行加入到缓冲区。由于sed的缓冲区只缓存一行数据,所以我们在这一将多行合并成了一行;\$\$!
表示没有匹配到$$
;b
类似于goto
这样一说基本就清楚了,括号里面的意思是先将 $$ 替换 ,然后加入缓存、匹配 $$
,最后替换。多行处理中 :label
和 N
基本是必备技能了。
第二个语句就没什么好说的了,唯一要注意的是\(\)
,sed会记住里面匹配的内容,在后面可以用 \1
,\2
等引用。上面就是个例子。
请原谅混乱的排版。。。。。。hexo渲染代码的部分又抽风了。。。。。