¿Cómo elimino el primer carácter en una columna específica usando sed

Tengo un file con la siguiente estructura:

999963803|081439403|FFF|33 999964211|081823904|FFF|33 999970948|081765738|FFF|33 999971835|081736346|FFF|33 999972780|082127527|FFF|33 

Necesito eliminar el primer caracter en la segunda columna, lo bash con sed "s/|.1|/^.\(.*\)/\1/" my_file.txt , pero no funciona, el resultado debe ser :

 999963803|81439403|FFF|33 999964211|81823904|FFF|33 999970948|81765738|FFF|33 999971835|81736346|FFF|33 999972780|82127527|FFF|33 

Este simple awk :

 awk -F"|" '{OFS="|"}$2=$2*1' file 

OFS define el separador de campo de salida. $2=$2*1 simplemente multiplica el segundo campo con 1 ; el cero inicial desaparece

con awk:

  awk -F"|" '{print $1"|"substr($2,2)"|"$3"|"$4}' <test 

Con POSIX sed:

 sed -e 's/[^|]\([^|]*|\)/\1/2' <file 

La expresión regular [^|][^|]*| es decir, una o más secuencias de caracteres excepto | , por lo que coincidirá con cada campo, excepto el último, necesita [^|][^|]*$ para que coincida con el último campo. 2 modificador hizo s ubstitute command solo hacer la sustitución para el segundo partido, que es el segundo campo.

Con GNU o BSD sed, puede simplificar la syntax para:

 sed -E 's/[^|]([^|]*|)/\1/2' <file 

( sed -E se convertirá en estándar en la próxima versión POSIX )

¿Por qué tan complejo?

Es el primer personaje después del primero | asi que…
sed <filename -e 's/|./|/'
… Deberia trabajar.

Es decir, encuentra el primero | e include el personaje que viene después, replace con just | .

p.ej:

 $ sed <mi_file.txt -e 's / | ./ | /'
 999963803 | 81439403 | FFF | 33
 999964211 | 81823904 | FFF | 33
 999970948 | 81765738 | FFF | 33
 999971835 | 81736346 | FFF | 33
 999972780 | 82127527 | FFF | 33

Nota: agregue /g al final para que reemplace todas las ocurrencias, no solo la primera.