С помощью Gnu sed:
sed -E 's/(([^,]*,){2}[^,]*),/\1\n/g'
Чтобы изменить количество полей в строке, измените {2}
на число, меньшее количества полей.Например, чтобы изменить каждую пятую запятую (как в заголовке вашего вопроса), вы должны использовать:
sed -E 's/(([^,]*,){4}[^,]*),/\1\n/g'
В регулярном выражении [^,]*,
означает «ноль или более»символы, отличные от ,
, за которыми следует ,
, другими словами, это одиночное поле, разделенное запятыми. Это не будет работать, если поля представляют собой строки в кавычках с внутренними запятыми или символами новой строки.
Независимо от того,из того, что говорит man sed
в Linux, флаг -E
является расширением Posix sed, что заставляет sed использовать расширенные регулярные выражения (ERE) вместо базовых регулярных выражений (см. man 7 regex
). -E
также работает на BSDsed, используется по умолчанию в Mac OS X. (Спасибо @EdMorton за примечание.)