Предотвращение пробелов в качестве разделителя в bash/shell для цикла

125
11

У меня есть переменная/файл (segment_size_date), которая содержит

11-Jul-2017 11:00,604;13-Jul-2017 10:00,604;

Это результат хранимой процедуры (oracle)

Я хочу разграничить содержимое, используя ';' так что 11 июля 2017 года 11: 00,604 находится в одной переменной, но она ограничивается с помощью пробела.

for i in (echo $segment_size_date | sed "s/;/ /g")
do
echo "$i"
done

я получаю вывод как

(11-Jul-2017) 1st line
(11:00,60413-Jul-2017) 2nd line
(10:00,604) 3rd line

я ожидаю, что

(11-Jul-2017 11:00,604) 1st line
(13-Jul-2017 10:00,604) 2nd line

И я хочу, чтобы он хранился в переменной/файле. Например, в первом цикле 11 июля 2017 года 11: 00,604 хранится в файле/переменной (я его обработаю), и следующий цикл 13-июл-2017 10: 00,604 сохраняется (переписывание не является проблемой)

Я пробовал использовать кавычки, но не повезло. "11 июля 2017 года 11: 00,604" "13 июля 2017 года 10: 00,604"

Еще одна вещь, которую я не могу вставить ничего в пробелы, как 11-июл-2017 11: 00,604; 13-июл-2017 10: 00,604 - я не могу вставить ничего в пробелы (11-июл-2017 11:00), это должно быть так, как есть.

И файл является только демо, он кодирует много строк, поэтому не может использовать cut -d ";" -f1 ', нужно использовать циклы.

Shell/bin/bash ---- linux

спросил(а) 2021-01-25T20:56:38+03:00 5 месяцев назад
1
Решение
132

Вероятно, вы просто хотите предварительно обработать данные, чтобы каждая точка привязки находилась в одной строке. Это упрощает работу с несколькими строками в нескольких файлах.

cat *-all-the-input-files | tr \; \\n | while read segment_size_data; do
...
done

Если ваши данные находятся в переменных (как в вашем примере), это становится:

$ d="11-Jul-2017 11:00,604;13-Jul-2017 10:00,604;"
$ printf "$d" | tr \; \\n | while read var; do echo v=$var; done
v=11-Jul-2017 11:00,604
v=13-Jul-2017 10:00,604

ответил(а) 2021-01-25T20:56:38+03:00 5 месяцев назад
45

Вы можете использовать awk:

awk -F\; '{ for (i=1;i<=NF;i++) { printf "%s\n",$i } }' filename

Задавать; в качестве разделителя для awk, а затем распечатать каждое поле (1 к числу полей), за которым следует возврат к графику.

ответил(а) 2021-01-25T20:56:38+03:00 5 месяцев назад
45

Вам просто нужно временно сбросить переменную IFS оболочки. Эта переменная используется для управления разбиением слов.

$ data='11-Jul-2017 11:00,604;13-Jul-2017 10:00,604;'
$ IFS=';' read startdate enddate somethingelse <<<"$data"
$ printf "%s\n" "$startdate" "$enddate" "$somethingelse"
11-Jul-2017 11:00,604
13-Jul-2017 10:00,604

$

ответил(а) 2021-01-25T20:56:38+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема