$ sed -E 's/(.{7})(.{6})(.{6})(.{6})/\1,\2,\3,\4/' file
0019121,002313,002316,003135
0057936,000814,000814,003023
0081638,001519,001523,001176
0090531,001841,001842,002633
0111210,001515,001518,000912
0115400,001807,001828,001593
То есть сопоставьте биты каждой строки, которая составляет новые поля, и вставьте запятую в -между ними. Сопоставление поля выполняется с помощью .{7}
или .{6}
в зависимости от требуемой длины поля.
Попробуйте следующее:
... |sed -nE '/^[[:blank:]*]+\[[^/]*\/(B-[0-9]+)-([^]]*)\].*/{
s//\1 \2/; :a s/(B-[0-9]+ [^-]*)-(.*)/\1 \2/;ta; p; }'
Советы:
[^X]*
:соответствует любому символу, но не символу X
(, а также \n
ewline в исключительных случаях ). [^X]*X
:соответствует любому символу, но не символу X
(, а также \n
ewline исключительно ), за которым следует символ X
. (...)
:фиксирует групповое совпадение с обратными -ссылками \1
для первого, \2
для второго и т. д. (вы можете увеличить только -до \9
обратные -ссылки ). :label s/find/replace/; t label
:перейти к label
для успешной замены и повторить команду. Или немного короче (в зависимости от формата ввода):
... |sed -nE '/^[^/]*\/([^]]*)\].*/{
s//\1/; :a s/(B-[0-9]+)(.*)-([^-]*)$/\1\2 \3/;ta; p; }'