У меня есть вывод команды сетевого мониторинга, и он выглядит так:
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.
В базовых регулярных выражениях (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 позволяет вам использовать escaped \+
в 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
Используя sed
echo ' 391KB 7.48MB 7.86MB' | sed -r 's/^ +//g;s/ +/,/g'
, вы получите
391KB,7.48MB,7.86MB
Или, в качестве альтернативы, если разделителем является пробел и вы можете объединить несколько пробелов, вы также можете использовать великолепный Miller таким образом
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