如何通过unix命令将带有键值对的文本文件转换为有序输出

mat*_*ath 0 shell

我有一个文本文件,其中包含不同变量的可能值范围

1. life:        short,long,na.
2. weather_f:   cloudy,rainy,sunny,foggy,cold,warm,mild,
                    humid,na.
3. sea_temp:    warm,mild,cold,na.
Run Code Online (Sandbox Code Playgroud)

我想得到一个如下所示的输出文件

short,long,na
cloudy,rainy,sunny,foggy,cold,warm,mild,humid,na
warm,mild,cold,na
Run Code Online (Sandbox Code Playgroud)

我尝试使用sed此功能,但新的线路weather_f让我遇到了困难。我怎样才能达到预期的输出?

Kus*_*nda 5

当一行以逗号结尾时,立即将下一行追加到缓冲区。这是通过sed使用表达式来完成的

/,$/N
Run Code Online (Sandbox Code Playgroud)

N命令将下一行附加到缓冲区中的文本,并使用换行符作为两者之间的分隔符。

要允许多个这样的连续行,请循环回到循环的开头以检查缓冲区末尾是否有逗号。

:again
/,$/ {
    N

    # branch to the "again" label at the top
    b again
}
Run Code Online (Sandbox Code Playgroud)

此后,我们不再需要添加到缓冲区中的行,因此我们可以开始修剪该行并按照我们想要的方式排列它。这包括删除第一个字符之前的所有:内容,删除所有类似空格的字符(包括 插入的换行符N),以及删除末尾的点。

s/[^:]*://
s/[[:space:]]//g
s/\.$//
Run Code Online (Sandbox Code Playgroud)

整个编辑脚本将是

:again
/,$/ {
    N
    b again
}
s/[^:]*://
s/[[:space:]]//g
s/\.$//
Run Code Online (Sandbox Code Playgroud)

这可以使用文件中的脚本(此处为script)来执行,例如

/,$/N
Run Code Online (Sandbox Code Playgroud)

或者,如果您想在命令行上键入脚本,

:again
/,$/ {
    N

    # branch to the "again" label at the top
    b again
}
Run Code Online (Sandbox Code Playgroud)

鉴于您问题中的数据,这将输出

s/[^:]*://
s/[[:space:]]//g
s/\.$//
Run Code Online (Sandbox Code Playgroud)

有些sed实现可能需要b again自己的表达:

:again
/,$/ {
    N
    b again
}
s/[^:]*://
s/[[:space:]]//g
s/\.$//
Run Code Online (Sandbox Code Playgroud)