我想仅对包含某个单词的行对某个列进行排序。我不希望看到不包含该字的行。例如,我有这个文本文件:
sdf ggfds 7
sdf sgs 5
sdf dfgs 3
foo dffg 2
bar dffg 2
sdf sddfg 4
我想为仅包含“sdf”字的行排序第3列(不必在第一列中)
我希望看到这个输出:
sdf dfgs 3
sdf sddfg 4
sdf sgs 5
sdf ggfds 7
答案 0 :(得分:16)
将输入传输到外部命令:
:%!grep sdf | sort -n -k3
详细说明:
答案 1 :(得分:8)
2个vim命令:
:v/sdf/d
:sort n /[^[:digit:]]*/
答案 2 :(得分:3)
Maxim Kim已经给出了一个很好的答案,我将在评论中添加这个,但它太复杂了,所以我会坚持回答:
您可以使用以下方法简化模式:
:v/sdf/d
sort n /\D*/
因为\D
相当于[^[:digit:]]
而且输入的次数要少得多。有关更多信息,请参阅
:help \D
要特别匹配第三个字段,而不仅仅是第一个数字,请使用
:sort n /\(\S\+\s+\)\{2}/`
或
:sort n /\v(\S+\s+){2}/
请参阅:
:help :sort
:help \S
:help \s
:help pattern.txt
:help \v
另外,有些人发现更容易记住:g!/sdf/d
,与:v/sdf/d
相同 - :g!
与:g
相反,与{:v
相同1}}。
:help :v
:help :g
答案 3 :(得分:3)
通过在可视模式下选择它来排序第二列(例如 Control + v ),然后运行:
!sort
或按第3栏排序
sort -k 3
或
:sort /.*\%3v/
或者,使用 Shift + V 命令选择要排序的行。然后输入
!sort -k 3n
或使用以下代码告诉Vim跳过每一行中的前两个单词并对以下内容进行排序:
:%sort /^\S\+\s\+\S\+\s\+/
或者按第8行排序:
:sort /.*\%55v/
'virtual'规范是列的绝对数,它将空格+制表符视为单个字符(很快,它不会将制表符视为八个空格),
所以要按最后一栏排序:
:%sort /\<\S\+\>$/ r