sed заменить символы в группе захвата

$ 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}в зависимости от требуемой длины поля.

0
17.02.2021, 22:38
1 ответ

Попробуйте следующее:

... |sed -nE '/^[[:blank:]*]+\[[^/]*\/(B-[0-9]+)-([^]]*)\].*/{
             s//\1 \2/; :a s/(B-[0-9]+ [^-]*)-(.*)/\1 \2/;ta; p; }'

Советы:

  • [^X]*:соответствует любому символу, но не символу X(, а также \newline в исключительных случаях ).
  • [^X]*X:соответствует любому символу, но не символу X(, а также \newline исключительно ), за которым следует символ 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; }'
2
18.03.2021, 22:29

Теги

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