首页 > 开发 > linux > 正文

Shell里如何过滤出文件中匹配某个规则的行以及它上面的注释行

2017-09-11 20:33:39  来源: 网友分享

例如,如何从 Vim 的配置文件 .vimrc 中过滤出所有快捷键映射的配置行以及它前面紧挨着的注释行?

我知道以下命令可以过滤出配置行:

sed -n '/^[^"].*<leader>/p' .vimrc

但是,如何连同该行前面紧邻的所有注释行也过滤出来,请高手帮忙解答,谢谢!

解决方案

sed 是流编辑器,要解决这个问题要一些技巧,sed -n '/^"/{H;d};/^"/!{/<leader>/{H;x;p;s/.*//;x;d};/<leader>/!{s/.*//;x;d};};' vimrc 应该能够达到要求,sed 命令教程请见 http://www.grymoire.com/Unix/Sed.html,详细说明如下。

sed -n '/^"/ {    # 匹配到注释行,附加到缓冲空间    H    # 删除模式空间,开始新一轮匹配    d}/^"/ !{    # 匹配到非注释行    /<leader>/ {        # 匹配到目标行,附加到缓冲空间        H        # 交换缓冲空间和模式空间        x        # 打印模式空间        p        # 清空缓冲空间        s/.*//        x        # 删除模式空间,开始新一轮匹配        d    }    /<leader>/ !{        # 非目标行,清除缓冲空间        s/.*//        x        # 删除模式空间,开始新一轮匹配        d    }}' vimrc

这类问题可能还是用 awk 比较合适。