我有一个文本文件,其中包含不同变量的可能值范围
1. life: short,long,na.
2. weather_f: cloudy,rainy,sunny,foggy,cold,warm,mild,
humid,na.
3. sea_temp: warm,mild,cold,na.
我想得到一个如下所示的输出文件
short,long,na
cloudy,rainy,sunny,foggy,cold,warm,mild,humid,na
warm,mild,cold,na
我尝试使用sed
此功能,但新的线路weather_f
让我遇到了困难。我怎样才能达到预期的输出?
答案1
当一行以逗号结尾时,立即将下一行追加到缓冲区。这是通过sed
使用表达式来完成的
/,$/N
该N
命令将下一行附加到缓冲区中的文本,并使用换行符作为两者之间的分隔符。
要允许多个这样的连续行,请循环回到循环的开头以检查缓冲区末尾是否有逗号。
:again
/,$/ {
N
# branch to the "again" label at the top
b again
}
此后,我们不再需要添加到缓冲区中的行,因此我们可以开始修剪该行并按照我们想要的方式排列它。这包括删除第一个字符之前的所有内容:
,删除所有类似空格的字符(包括 插入的换行符N
),以及删除末尾的点。
s/[^:]*://
s/[[:space:]]//g
s/\.$//
整个编辑脚本将是
:again
/,$/ {
N
b again
}
s/[^:]*://
s/[[:space:]]//g
s/\.$//
这可以使用文件中的脚本(此处为script
)来执行,例如
sed -f script file
或者,如果您想在命令行上键入脚本,
sed -e :again \
-e '/,$/ { N; b again; }' \
-e 's/[^:]*://' \
-e 's/[[:space:]]//g' \
-e 's/\.$//' file
鉴于您问题中的数据,这将输出
short,long,na
cloudy,rainy,sunny,foggy,cold,warm,mild,humid,na
warm,mild,cold,na
有些sed
实现可能需要b again
自己的表达:
sed -e :again \
-e '/,$/ { N' -e 'b again' -e '}' \
-e 's/[^:]*://' \
-e 's/[[:space:]]//g' \
-e 's/\.$//' file