这个问题与这个问题是互补的:按字母顺序对行包进行排序。回答完之后,我发现我完全误解了这个问题,并解决了另一个问题。为了不让我的解决方案被遗忘,我在这里发布了这个问题(下面是我的解决方案)。
考虑如下文本:
[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.txt
,sed …
整个命令在哪里。
流程如下:
sed
[
在行首的每个字符前插入空字符,除非该行是第一行。这样,空字符可以分隔配置文件。split
生成块,采用以空字符分隔的记录,每个块一个记录。不是写入文件,而是split
为每个块分别调用过滤器:- 首先
tr
删除空字符(实际上是:块中的单个尾随空字符); - 然后
read
只printf
回显块的第一行(标题); - 最后
sort
用剩下的行完成它的工作。 - 块按顺序处理;输出是单个连接流。