У меня есть содержимое ниже в файле.
Thu_Jun_04_09:30:22_2020=some_string:some_string=Thu_Jun_04_09:32:04_2020=some_str:some_string=some_string=Thu_Jun_04_09:35:05_2020=some_str:some_string,some_str
Я хочу, чтобы эта строка разбивалась только тогда, когда найдена дата. Однако формат даты всегда будет одинаковым, но дату можно изменить. поэтому я хочу, чтобы вывод был в формате ниже.
Thu_Jun_04_09:30:22_2020=some_string:some_string
Thu_Jun_04_09:32:04_2020=some_str:some_string=some_string
Thu_Jun_04_09:35:05_2020=some_str:some_string,some_str
Учтите, что строку можно добавить между строками, но ее следует разделять только после того, как дата будет найдена.
Следующий шаблон регулярного выражения соответствует вашему формату даты:
((Mon|Tue|Wed|Thu|Fri|Sat|Sun)_(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)_[0-9]+_[0-9]+:[0-9]+:[0-9]+_[0-9]+)
В GNU sed
вы можете добавлять \n
перед каждой датой:
echo "Thu_Jun_04_09:30:22_2020=some_string:some_string=Thu_Jun_04_09:32:04_2020=some_str:some_string=some_string=Thu_Jun_04_09:35:05_2020=some_str:some_string,some_str"\
| sed -Ee 's/((Mon|Tue|Wed|Thu|Fri|Sat|Sun)_(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)_[0-9]+_[0-9]+:[0-9]+:[0-9]+_[0-9]+)/\n\1/g'
Если результирующая пустая строка в начале вас беспокоит, вы можете передать ее по каналуsed -e '/^$/d'
В идеале вы должны изменить то, что производит эти данные, чтобы вставлять новые строки в нужных местах. Если «некоторая строка» действительно является любым текстом, то это может быть дата в том же формате, что и другие даты в строке (Thu_Jun_04_09:30:22_2020=Thu_Jun_04_09:30:22_2020=Thu_Jun_04_09:30:22_2020:Thu_Jun_04_09:30:22_2020
), что затрудняет работу с ней. Поэтому всегда полезно включать в вопрос фактические данные.
В частности, с использованием GNU sed
с данными, указанными в вопросе:
$ sed 's/=\(..._\)/\n\1/g' file
Thu_Jun_04_09:30:22_2020=some_string:some_string
Thu_Jun_04_09:32:04_2020=some_str:some_string=some_string
Thu_Jun_04_09:35:05_2020=some_str:some_string,some_str
Это заменяет =
перед каждым Thu_
новой строкой.
Thu_
соответствует ..._
, т.е. «три символа и подчеркивание». Если это слишком слабо, вы можете использовать
sed -E 's/=((Mon|Tue|Wed|Thu|Fri|Sat|Sun)_)/\n\1/g' file
вместо этого, явно сопоставляя каждое допустимое название дня недели.
Обратите внимание, что для этого требуется GNU sed
в качестве стандарта sed
нельзя вставлять новые строки с помощью команды s///
(или использовать расширенные регулярные выражения с помощью -E
в этом отношении ).