【问题标题】:How to sort text by section and also sort lines under the section in linux?如何按部分对文本进行排序并在linux中对部分下的行进行排序?
【发布时间】:2021-09-01 09:33:31
【问题描述】:

我有一个像这样的文本配置文件:


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'

使用哪个命令?

【问题讨论】:

    标签: linux bash sorting text-manipulation


    【解决方案1】:

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

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

    【讨论】:

    • 这很好用。但它会删除开头、结尾和部分之间的空行。是否可以在不删除空行的情况下做到这一点?
    • 啊,是的,这些很重要。会修复的。
    • 我认为您只需执行say "$_\n" 在每条记录后添加一个额外的换行符即可获得所需的内容。
    • 非常感谢您的努力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2011-04-28
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多