sed 多行问题

由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

这样一说基本就清楚了,括号里面的意思是先将 $$ 替换 ,然后加入缓存、匹配 $$ ,最后替换。多行处理中 :labelN 基本是必备技能了。

第二个语句就没什么好说的了,唯一要注意的是\(\),sed会记住里面匹配的内容,在后面可以用 \1,\2等引用。上面就是个例子。

请原谅混乱的排版。。。。。。hexo渲染代码的部分又抽风了。。。。。