我有一个文本配置文件,如下所示:
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 块中运行最终代码。