我有一组包含以相反顺序书写的注释的文件:
###### 27/07/2016-15:04:20 GMT+1:
Really? More?
###### 27/07/2016-15:04:18 GMT+1:
It happened again!
###### 27/07/2016-15:04:16 GMT+1:
A thing happened
我希望它们按以下顺序出现:
###### 27/07/2016-15:04:16 GMT+1:
A thing happened
###### 27/07/2016-15:04:18 GMT+1:
It happened again!
###### 27/07/2016-15:04:20 GMT+1:
Really? More?
其中一些文件有几百个条目 - 实现这一点的最简单方法是什么?
答案1
仅限战术
命令tac
可以做到。
$ tac -b -s "######" file.log
通过 Vim 调用 tac
如果你想在 Vim 中运行它:
:%!tac -b -s "\#\#\#\#\#\#"
%
表示所有行。
!
运行外部命令。
需要使用反斜杠来转义数字#
符号"\#\#\#\#\#\#"
。
仅限 Vim
这些命令用制表符替换换行符。如果日志中存在制表符,则使用其他字符代替制表符。
:%s/\n/\t/g
:%s/\t######/\r######/g
:g/^/m0
:%s/\t/\r/g
答案2
如果最后有一个换行符,则以下命令将在 Vim 中执行您想要的操作:
g/^###/.,/^$/m 0
搜索以 开头的行,###
并将范围从###
到下一个空白行移动到顶部。
如果没有最后的换行符,它可能会以例如中止E16: invalid range
,在这种情况下,您可以像这样调整正则表达式:
g/^###/.,/\(^$\|\%$\)/m 0
但是,由于缺少最后一行,第一个条目之后不会有新行,因此毕竟只需添加一个空行添加结尾并使用第一个命令可能会更容易。