У меня есть много строк как ниже:
123; XXXXXXXXXXXXXXX; ABCDE; YYYYYYYY; 08082010; 000000000000000; 08.03.10; 110000; ZZZZZZZZZZZZZZZZZ; 0002
Я просто хочу изменить числовой формат (15 цифр) XXXXXXXXXXXXXXX к XXXXXXXXX; XXX; XXX
и
YYYYYYYYY (9 цифр) к YYYYYY; YYY
с sed.
любой другой формат просто оставляет значение по умолчанию
При предположении, что "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;/"
когда у Вас есть структурированные данные и разделители полей, его более легкое для использования 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$) для Вашего желаемого вывода. Для изменения формата используйте подстроковое представление. Наконец задержите выходного разделителя полей к"";.
это более ясно, чем использование долго нарушенного regex с sed.