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

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

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

                     391KB     7.48MB     7.86MB

首先,它有很多空格。现在我想用 替换所有空格,
我试过了sed 's/ /,/g' input_file > output_file,但结果并不完全符合我的预期:

,,,,,,,,,,,,,,,,,,,,,391KB,,,,,7.48MB,,,,,7.86MB

我甚至尝试过:

sed -r 's/(.*) /\1,/; s/ //g' file.txt > output.txt

但输出如下:

391KB7.48MB,7.86MB

我怎样才能用一个逗号替换空格序列?
我认为有必要提一下我想将此数据添加到 csv 文件中。

答案1

*您可以使用(space-space-star) 或来在基本正则表达式 (BRE) 中匹配一个或多个空格序列\{1,\}。在扩展正则表达式 (ERE) 中,您可以使用{1,}+。这些构造的通用名称是量词

$ 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

GNU sed 允许你使用逃脱 \+在 BRE 中(以及\?0 或 1 量词) - 就像 GNU grep 一样。

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

$ echo '                     391KB     7.48MB     7.86MB' | tr -s ' ' ,
,391KB,7.48MB,7.86MB

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

$ echo '                     391KB     7.48MB     7.86MB' | awk '{$1=$1} 1' OFS=,
391KB,7.48MB,7.86MB

答案2

使用 sed

echo '                     391KB     7.48MB     7.86MB' | sed -r 's/^ +//g;s/ +/,/g'

你将会拥有

391KB,7.48MB,7.86MB

或者,如果分隔符是空格,并且您可以合并多个空格,那么您也可以使用大磨坊主这样

echo '                     391KB     7.48MB     7.86MB' | mlr --n2c --ifs ' ' -N --repifs cat

具有

391KB,7.48MB,7.86MB

从文件开始

<input mlr --n2c --ifs ' ' -N --repifs cat >output.csv

相关内容