Eliminar zeros à esquerda em um registro específico

1

Precisa eliminar o zero inicial do registro do trailer somente.

 H|09/24/2015
 D|25.00|Name1|Tfile|5
 D|7.25|Name2|Tfile|1
 T|032.25|03

Eu consegui fazer isso:

 sed -e 's/T|0*/T|/g' SampleFileName

Eu me livrei do zero inicial no trailer depois do T|32.25 , mas não do 03 depois.

    
por Ashy 24.09.2015 / 20:27

3 respostas

3

Usando sed

Se você deseja apenas fazer a substituição no último campo, é necessário ancorar o regex no final da linha:

$ sed -Ee '/T/ s/[|]0*([[:digit:]]+)$/|/' SampleFileName
 H|09/24/2015
 D|25.00|Name1|Tfile|5
 D|7.25|Name2|Tfile|1
 T|032.25|03

$ corresponde apenas ao final da linha. A condição (opcional) /T/ limita a substituição a linhas que contêm T .

O acima foi testado no GNU sed, mas eu espero que ele funcione no BSD (OSX) sed também.

Usando o awk

o awk divide as linhas em campos. Com o awk, podemos realizar a substituição apenas no último campo (que o awk chama $NF ):

$ awk -F'|' '/T/{sub(/^0+/,"",$NF)} 1' OFS='|' SampleFileName 
 H|09/24/2015
 D|25.00|Name1|Tfile|5
 D|7.25|Name2|Tfile|1
 T|032.25|3
    
por 24.09.2015 / 20:37
1

Você também pode usar o perl como um comando oneliner. Por exemplo, para este problema, você pode usar:

 $ perl -p -e 'if (/^T/) { s/\|0*/\|/g } ' SampleFileName
 H|09/24/2015
 D|25.00|Name1|Tfile|5
 D|7.25|Name2|Tfile|1
 T|32.25|3
 $  

Em if , a regex verifica se a linha começa com T letter (como suponho que essas linhas devem ser direcionadas) e em { } block regex substitui todos os zeros após | pipe.

    
por 24.09.2015 / 20:50
1

Outro perl one-liner:

perl -pe 's/\|0+(?=\d)/|/g if /^T\|/;'

O texto acima irá traduzir T|00| e T|00.00| para T|0| e T|0.00| , respectivamente.

    
por 24.09.2015 / 23:50