Замена последовательности символов на другую

У меня есть вывод команды сетевого мониторинга, и он выглядит так:

                     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.

0
задан 14 June 2021 в 11:45

2 ответа

В базовых регулярных выражениях (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
5
ответ дан 28 July 2021 в 11:29

Используя 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
0
ответ дан 28 July 2021 в 11:29

Другие вопросы по тегам:

Похожие вопросы: