Vim 如何对包含特定单词的行按列排序

Vim 如何对包含特定单词的行按列排序,vim,Vim,我只想对包含特定单词的行的特定列进行排序。我不想看到不包含该单词的行。例如,我有一个文本文件: sdf ggfds 7 sdf sgs 5 sdf dfgs 3 foo dffg 2 bar dffg 2 sdf sddfg 4 我想对第三列中只包含“sdf”字的行进行排序(不必在第一列中) 我想看到这个输出: sdf dfgs 3 sdf sddfg 4 sdf sgs 5 sdf ggfds 7 通过管道将输入传

我只想对包含特定单词的行的特定列进行排序。我不想看到不包含该单词的行。例如,我有一个文本文件:

 sdf ggfds   7
 sdf sgs     5
 sdf dfgs    3
 foo dffg    2
 bar dffg    2
 sdf sddfg   4
我想对第三列中只包含“sdf”字的行进行排序(不必在第一列中)

我想看到这个输出:

 sdf dfgs    3
 sdf sddfg   4
 sdf sgs     5
 sdf ggfds   7

通过管道将输入传输到外部命令:

:%!grep sdf | sort -n -k3
详情:

  • 使用“%”选择整个内容
  • 使用“!”将其传递到外部命令
  • grep onyl包含“sdf”的行
  • 在第三个字段(-k3)上对这些行进行数字排序(-n)
  • 2个vim命令:

    :v/sdf/d
    :sort n /[^[:digit:]]*/
    
    • 首先删除不包含“sdf”的所有行
    • 第二种方法是忽略非数字对数字进行排序

    Maxim Kim已经给出了一个很好的答案,我打算在评论中添加这一点,但它太复杂了,所以我将把它放在一个答案中:

    您可以使用以下方法简化模式:

    :v/sdf/d
    sort n /\D*/
    
    因为
    \D
    相当于
    [^[:digit:][]
    ,而且打字要少得多。有关详细信息,请参阅

    :help \D
    
    要特别匹配第三个字段,而不仅仅是第一个数字,请使用

    :sort n /\(\S\+\s+\)\{2}/`
    

    见:

    顺便说一句,有些人发现更容易记住
    :g/sdf/d
    ,其作用与
    :v/sdf/d
    -
    :g
    :g
    相反,与
    :v
    相同

    :help :v
    :help :g
    

    通过在视觉模式下选择第二列进行排序(例如Control+v),然后运行:

    !sort
    
    或按第3列排序

    sort -k 3 
    

    或者,使用Shift+V命令选择要排序的行。然后进入

    !sort -k 3n
    
    或者使用下面的代码告诉Vim跳过每行中的前两个单词,并根据以下内容进行排序:

    :%sort /^\S\+\s\+\S\+\s\+/ 
    
    或按第8行排序:

    :sort /.*\%55v/
    
    “虚拟”规范是列的绝对数,它将空格+制表符视为单个字符(简而言之,它不将制表符计算为八个空格)

    因此,要按最后一列进行排序:

    :%sort /\<\S\+\>$/ r
    
    :%sort/\$/r
    
    +1:一种很好的原生Vim方式,无需生成外部外壳。一种有趣的方式,Maxim,但我也希望在特定列上排序是的,操作系统的排序使按特定列排序更容易,但您可以使用:sort n/\v(\s+\s+{2}/在Vim中执行Al指出的相同操作。当然,只有在安装了grep和sort的计算机上,这才有好处-Windows上的许多Vim用户会发现这不起作用,可能不想安装gnuwin32或cygwin。到目前为止,这是最好、最直观的答案!
    :%sort /^\S\+\s\+\S\+\s\+/ 
    
    :sort /.*\%55v/
    
    :%sort /\<\S\+\>$/ r