У меня есть временный файл, создаваемый заданием 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 символов)!