Как разделить строки только после того, как дата найдена

У меня есть содержимое ниже в файле.

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

Учтите, что строку можно добавить между строками, но ее следует разделять только после того, как дата будет найдена.

0
17.06.2020, 14:30
2 ответа

Следующий шаблон регулярного выражения соответствует вашему формату даты:

((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'

1
18.03.2021, 23:26

В идеале вы должны изменить то, что производит эти данные, чтобы вставлять новые строки в нужных местах. Если «некоторая строка» действительно является любым текстом, то это может быть дата в том же формате, что и другие даты в строке (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в этом отношении ).

1
18.03.2021, 23:26

Теги

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