我有很多类似下面的行:
123;XXXXXXXXXXXXXXX;ABCDE;YYYYYYYY;08082010;000000000000000;03/08/10;110000;ZZZZZZZZZZZZZZZZZ;0002
我只想将数字格式(15 位数字) XXXXXXXXXXXXXXX 更改为 XXXXXXXXX;XXX;XXX
和
YYYYYYYYY(9 位数字)至 YYYYYY;YYY
使用 sed。
任何其他格式只需保留默认格式
答案1
假设“X”和“Y”代表数字,并且您的示例行实际上有 9 个“Y”数字(在您的问题中有 8 个,但您想要的分割显示 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;/"
答案2
当您拥有结构化数据和字段分隔符时,使用 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 中冗长混乱的正则表达式更清晰。