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
    

    这样,整个个文件就完成去重。所有条目都是唯一的了。系统中有那些中文字体就一目了然。

不到一分钟搞定。想几年前我扒一个网站的HTML文件里的表格数据的时候,又是手工,又是用Python爬DOM。一整天都能浪费掉。。。。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,509评论 0 5
  • 从匹配中返回值 Match 对象 成功的匹配总是返回一个 Match 对象, 这个对象通常也被放进 $/ 中, (...
    焉知非鱼阅读 1,858评论 0 1
  • 你,为什么突然说,想换座位了。 白净,上学期的你分明不是如此的,乍一转眼,时光匆匆,你也是说变就变,再见到你...
    梵O_o筱阅读 324评论 0 0
  • 安装deepTools需要依赖pyBigWig包。安装pyBigWig包时出错: 找到错误 上网搜索解决方法发现,...
    JeremyL阅读 3,481评论 3 2