如何在 linux 中按部分对文本进行排序以及对该部分下的行进行排序?



我有一个文本配置文件,如下所示:


config server 'server'
option url 'https://chef.libremesh.org'
config client 'client'
option upgrade_packages '1'
option auto_search '0'
option advanced_mode '0'

我希望输出是这样的:


config client 'client'
option advanced_mode '0'
option auto_search '0'
option upgrade_packages '1'
config server 'server'
option url 'https://chef.libremesh.org'

使用哪个命令?

我的perl有点生疏,所以这当然可以做得更干净。 尝试:

perl -nE 'BEGIN{$/=""}; @b = split "n", $_; 
@a = shift @b; push @a, sort @b; 
push @f, join("n", @a); END{ say "$_n" foreach sort @f }' input

将 $/设置为空字符串,以便 perl 将每个部分作为记录读取。 初始split在换行符上拆分每条记录,然后我们通过移出部分的第一行然后对其余行进行排序来构造数组@a。 从中构造一个字符串并将其推送到数组@f。 最后,对部分进行排序并写入输出。

您可以通过自动拆分来修剪一点:

perl -F'n' -a -nE 'BEGIN{$/=""}; 
push @f, join "n", shift @F, sort @F;
END{ say "$_n" foreach sort @f } ' input

或:

perl -00 -F'n' -a -nE 'push @f, join "n", shift @F, sort @F} 
{print join "nn", sort @f' input

最后一个命令是一个有点奇怪的成语,它利用了-n将命令放在隐式while(<>){...}结构中的事实,代码中的第一个}匹配隐式{,而"不匹配"{匹配隐式},使其类似于在 END 块中运行最终代码。

最新更新