我有以下输入文件:
abcde
abc
abcdef
abcd
我想按行长排序。我可以通过运行输出命令1,4!awk '{print length, $0}' | sort -n -s | cut -d' ' -f2
来执行此操作:
abc
abcd
abcde
abcdef
现在我想创建一个与上面完全相同的用户定义命令SortL
:
command! -count SortL <count>!awk '{print length, $0}' | sort -n -s | cut -d' ' -f2-
但是当我在输入文件上运行1,4SortL
时,我得到:
abcde
abc
abcdef
abcd
没有进行任何更改,因此我必须在SortL
的定义上犯了错误。如何定义SortL
以使行按长度排序?
答案 0 :(得分:1)
请注意,它也可以仅在vimscript中完成,它具有可移植的优点(鉴于它是从vim运行的 - 好的,lambda是最近的,它们现在已经2年了?)
command! -range=% SortL
\ call setline(<line1>,
\ sort(getline(<line1>,<line2>),
\ { a, b -> strchars(a) - strchars(b)}))
BTW,strchars()
将正确计算多字节字符的字形数,而不是字节数。
答案 1 :(得分:0)
为了完整起见,答案是:
command! -range SortL <line1>,<line2>!awk '{print length, $0}' | sort -n -s | cut -d' ' -f2-