2

У меня много строк, как показано ниже:

123; XXXXXXXXXXXXXXX; ABCDE; YYYYYYYY; 08082010; 000000000000000; 03/08/10; 110000; ZZZZZZZZZZZZZZZZZ; 0002

Я просто хочу изменить формат чисел (15 цифр) XXXXXXXXXXXXXXX на XXXXXXXXX; XXX; XXX

а также

ГГГГГГГ (9 цифр) в ГГГГГГ; ГГГГ

с сед.

любой другой формат просто оставь по умолчанию

2 ответа2

1

Предполагая, что "X" и "Y" представляют цифры и что в строке примера на самом деле есть 9 "Y" цифр (в вашем вопросе их восемь, но требуемый разделитель показывает 9), это должно сработать:

sed 's/;\([0-9]\{6\}\)\([0-9]\{3\}\);/;\1;\2;/;s/;\([0-9]\{9\}\)\([0-9]\{3\}\)\([0-9]\{3\}\);/;\1;\2;\3;/'

Вы можете использовать переменные, чтобы сделать его немного более читабельным:

dig3="[0-9]\{3\}"
dig6="[0-9]\{6\}"
dig9="[0-9]\{9\}"
sed "s/;\($dig6\)\($dig3\);/;\1;\2;/;s/;\($dig9\)\($dig3\)\($dig3\);/;\1;\2;\3;/"
1

когда вы структурировали данные и разделители полей, проще использовать awk. В ваших данных у вас есть ";" как разделители, так что используйте его.

awk -F";" '
{
  $2=substr($2,0,9)";"substr($2,9,3)";"substr($2,12,3)
  $4=substr($4,0,6)";"substr($4,7)
}{print}
' OFS=";" file

В выражении awk написано ";" в качестве разделителей, затем работайте над полями 2 и 4 ($ 2, $ 4) для желаемого результата. Чтобы изменить формат, используйте подстроку. Наконец, установите разделитель выходного поля обратно на «;».

это понятнее, чем использование длинных беспорядочных регулярных выражений с sed.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .