我有一个文本文件,其中包含不同变量的可能值范围
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
让我遇到了困难。我怎样才能达到预期的输出?
当一行以逗号结尾时,立即将下一行追加到缓冲区。这是通过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)
归档时间: |
|
查看次数: |
33 次 |
最近记录: |