用另一个字符替换一个字符的序列

0 command-line csv text-processing

我有一个网络监控命令的输出,它看起来像这样:

                     391KB     7.48MB     7.86MB
Run Code Online (Sandbox Code Playgroud)

其中有很多空间先。现在我想用,.
我试过了sed 's/ /,/g' input_file > output_file,但结果并不完全符合我的预期:

,,,,,,,,,,,,,,,,,,,,,391KB,,,,,7.48MB,,,,,7.86MB
Run Code Online (Sandbox Code Playgroud)

我什至试过:

sed -r 's/(.*) /\1,/; s/ //g' file.txt > output.txt
Run Code Online (Sandbox Code Playgroud)

但输出如下:

391KB7.48MB,7.86MB
Run Code Online (Sandbox Code Playgroud)

如何用一个逗号替换空格序列?
我认为很高兴提到我想将此数据添加到 csv 文件。

ste*_*ver 5

您可以使用 *(space-space-star) 或 \{1,\}. 在扩展正则表达式 (ERE) 中,您可以使用 {1,} +。这些构造的通用名称是Quantifiers

$ echo '                     391KB     7.48MB     7.86MB' | sed 's/  */,/g'
,391KB,7.48MB,7.86MB

$ echo '                     391KB     7.48MB     7.86MB' | sed -r 's/ +/,/g'
,391KB,7.48MB,7.86MB
Run Code Online (Sandbox Code Playgroud)

GNU sed 允许您在 BRE(以及0 或 1 量词)中使用转义 \+\?- GNU grep 也是如此。

您还可以将tr, 与-s( --squeeze-repeats) 标志一起使用:

$ echo '                     391KB     7.48MB     7.86MB' | tr -s ' ' ,
,391KB,7.48MB,7.86MB
Run Code Online (Sandbox Code Playgroud)

但是,如果您不想要一个空的初始 CSV 字段,请考虑使用 awk - 因为使用默认字段分隔符,它将把连续的空格视为单个分隔符,并忽略前导空格:

$ echo '                     391KB     7.48MB     7.86MB' | awk '{$1=$1} 1' OFS=,
391KB,7.48MB,7.86MB
Run Code Online (Sandbox Code Playgroud)