如何按节对文本进行排序,并在 linux 中对节下的行进行排序?

How to sort text by section and also sort lines under the section in 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。最后,对部分进行排序并写入输出。

您可以 trim 通过自动拆分一点:

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 "\n\n", sort @f' input

最后一个命令有点奇怪,它利用了 -n 将命令置于隐式 while(<>){...} 构造中并且代码中的第一个 } 与隐式 { 而“不匹配” { 与隐式 } 匹配,使其类似于 运行 END 块中的最终代码。