Life|Life With Vim[0] 批量格式化和去重

晚上想着重新弄一下Urxvt的中文字体。
其实字体文件挺讨人厌的。主要是因为,同一种字体的各种bolditaliccondensed等等的字形都在不同的字体文件中定义。而我下载的又是字体包,而且好几个带中文的(其中包含一些韩日语的字体)。时间一长,fc-list :lang=zh的输出看的我头的大。于是立马就想到用Vim整理一下看看都有哪些。
于是

fc-list :lang=zh > fonts vim fonts

里面超过两百条条目都是这样的:
/usr/share/fonts/adobe-source-han-sans/SourceHanSans-ExtraLight.ttc: Source Han Sans K,???,Source Han Sans K ExtraLight,??? ExtraLight:style=ExtraLight,Regular

大致格式就是:
字体文件路径:字体家族名,别名1,别名2:所定义的字体风格

而其中字体家族名是我真正需要的东西:
  1. 首先把字体名晒出来。也就是删掉每行第一个冒号前的第二个冒号后的所有内容:
    :%s/^.*:\(.*\):.*$/\1/g

    解释:
    : 进入命令模式
    % 在整个文档范围内匹配
    s/XXX/YYY/g 把所有匹配到的XXX替换成YYY
    XXX=^.*:\(.*\):.*$
    开头的^ 是代表行首
    .* 代表任意个任意字符
    : 代表冒号
    \(.*\) 记下这一串匹配到的字符串,也就是在两个冒号之间的任意个任意字符
    结尾的$ 代表行尾
    YYY=\1 调用刚刚被匹配并记录下来的字符串
    就把原来的条目变成了这样:
    Source Han Sans K,???,Source Han Sans K ExtraLight,??? ExtraLight

  2. 然后需要删掉所有的别名只留下一个家族名。因为在调用字体时,别名通常被限定在某种字形上,而通过家族名调用,则相当于调用了所有字形。该粗该细还是该斜体,只需要制定一个家族名,系统会按需选择。又因为家族名都在第一项,别名用逗号隔开。可以按照上面的命令再来一次:
    :%s/^\([^,]*\),.*$/\1/g

    和上面差不多,只不过在定义XXX的匹配模式的时候用到了[^,]*。以外匹配除了,外的任意个所有字符。
    因为,*默认匹配最长的字符串,如果行内不止一个,它就会默认把后面表达式中的哪个,匹配到行内最后一个。其实还有别的方法,但是我实在懒得记。
    这样条目就只剩下家族名了:
    Source Han Sans K

  3. 因为别名的关系,家族名有很多重复的。所以只需要:
    :%sort u

    这样,整个个文件就完成去重。所有条目都是唯一的了。系统中有那些中文字体就一目了然。
【Life|Life With Vim[0] 批量格式化和去重】不到一分钟搞定。想几年前我扒一个网站的HTML文件里的表格数据的时候,又是手工,又是用Python爬DOM。一整天都能浪费掉。。。。

    推荐阅读