Как использовать sed для замены всех вхождений шаблона за вычетом одного случая?

Как использовать sed для замены всех вхождений шаблона за вычетом одного случая?

У меня есть временный файл, создаваемый заданием cron каждые полчаса, который выдает следующий вывод:

---- kind=<data> field=<value> humankind=<data> kind=<data> field=<value> humankind=<data> kind=<data> field=<value> humankind=<data>

Я хочу отформатировать его так, чтобы он выглядел так:

---- kind=<data> field=<value> humankind=<data>
kind=<data> field=<value> humankind=<data>
kind=<data> field=<value> humankind=<data>

Я попробовал следующие выражения sed:

sed -r 's|\s(kind=)|\n\1|g' /path/to/file

Но тогда вывод выглядит так:

----                                         <------ The first line should be here
kind=<data> field=<value> humankind=<data>
kind=<data> field=<value> humankind=<data>
kind=<data> field=<value> humankind=<data>

Используя это выражение:

sed -r 's|[^-]{4} (kind=)|\n\1|g' /path/to/file

Генерирует нужный мне вывод, но со странным поведением:

---- kind=<data> field=<value> humankind=<incomplete data>
kind=<data> field=<value> humankind=<incomplete data>
kind=<data> field=<value> humankind=<incomplete data>

По какой-то причине последнее поле (содержащее часть шаблона, используемого в выражении sed) выводит только первые два символа «неполных данных».

Что я делаю не так?

решение1

Проблема в sed -r 's|\s(kind=)|\n\1|g' /path/to/fileтом, что вы вставляете новую строку для всех вхождений ' kind', включая первое, поэтому вы получаете дополнительную новую строку после ----. Вместо этого попробуйте

sed -E 's|\s(kind=)|\n\1|2g' /path/to/file

так как он пропустит первый матч.

Второй вариант не срабатывает, потому что он соответствует 4 символам перед «kind», а это часть ваших данных (которые должны быть длиной 6 символов)!

Связанный контент