如何对用标题分隔的多个“块”内的行分别进行排序?

如何对用标题分隔的多个“块”内的行分别进行排序?

这个问题与这个问题是互补的:按字母顺序对行包进行排序。回答完之后,我发现我完全误解了这个问题,并解决了另一个问题。为了不让我的解决方案被遗忘,我在这里发布了这个问题(下面是我的解决方案)。


考虑如下文本:

[ProfileB]
param3=z
param2=y
param1=x
[ProfileA]
param1=k
param3=l
param2=

我需要对每个[Profile*]块内的参数分别进行排序。上面的示例应按如下方式排序:

[ProfileB]
param1=x
param2=y
param3=z
[ProfileA]
param1=k
param2=
param3=l

我如何使用标准 Unix/Linux 工具来完成此操作?

答案1

这在我的 Debian 中有效:

sed '1 ! s/^\[/\x00\[/' |
split -t '\0' -l 1 --filter='
   tr -d "\0" |
   { IFS="" read -r REPLY; printf "%s\n" "$REPLY"; sort; }
'

要使用文件,请使用重定向,例如{ sed … ; } <input.txt >output.txtsed …整个命令在哪里。

流程如下:

  1. sed[在行首的每个字符前插入空字符,除非该行是第一行。这样,空字符可以分隔配置文件。
  2. split生成块,采用以空字符分隔的记录,每个块一个记录。不是写入文件,而是split为每个块分别调用过滤器:
  3. 首先tr删除空字符(实际上是:块中的单个尾随空字符);
  4. 然后readprintf回显块的第一行(标题);
  5. 最后sort用剩下的行完成它的工作。
  6. 块按顺序处理;输出是单个连接流。

相关内容