如何对文本块进行排序?

3

I have a text of 50000 lines

before change

bird={
explain line1
explain line2
...
}
zero={
explain line1
explain line2
...
}
bed={
explain line1
explain line2
...
}
air={
explain line1
explain line2
...
}
.......

我希望你能将其改为

air={
explain line1
explain line2
...
}
bed={
explain line1
explain line2
...
}
bird={
explain line1
explain line2
...
}
zero={
explain line1
explain line2
...
}

我的解决方案分为四个步骤:
1.:g/{/;/}/s/$/@(@不包括在文件中)
2.:g/{/;/}/j! 3.:sort 4.:%S/@/\r/g 有更好的解决方案吗?一步到位?

我也使用了替换-连接-排序-分割方法来完成这样的任务。我很想找到一个更好的解决方案来代替它。我通常觉得awk可能是更好的工具。 - Peter Rincker
我更喜欢使用以空字符结尾的字符串,而不是使用“@”,这样可以使用外部的sort(1)命令。 :%s/}\n/&<CTRL-V><CTRL-J>/g | %!sort -z | tr -d '\000' - ernix
1个回答

2
Vim在排序时没有内置的“将这些块视为单个单位”的概念;同时折叠也无法帮助。您提出的方法(首先将每个块的所有行连接成一条长线,然后进行排序,最后取消连接)是经典的解决方法。
当然,如果您需要更频繁地使用此功能,可以为其定义自定义:command。有一个适用于折叠的示例,请参见此链接

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接