我有一个来自网络监控命令的输出,它看起来像这样:
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