Как удалить первый символ в определенном столбце, используя sed

У меня есть файл со следующей структурой:

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

Мне нужно удалить первый символ во втором столбце, я попробую с sed "s/|.1|/^.\(.*\)/\1/" my_file.txt , но не работает, результат должен быть :

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

Этот простой awk :

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

OFS определяет разделитель выходного поля. $2=$2*1 просто умножает второе поле на 1 ; начальный нуль исчезает.

с awk:

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

С помощью POSIX sed:

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

Регулярное выражение [^|][^|]*| означает одну или несколько последовательностей символов, кроме | , поэтому он будет соответствовать всем полям, кроме последнего, вам нужно [^|][^|]*$ чтобы соответствовать последнему полю. 2 , сделанная командой substitute, выполняет только замену второго совпадения, которое является вторым полем.

С помощью GNU или BSD sed вы можете упростить синтаксис:

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

( sed -E станет стандартным в следующей версии POSIX )

Почему так сложно?

Это первый символ после первого | так…
sed <filename -e 's/|./|/'
… должно сработать.

То есть, найдите первый | и включить символ после него, заменить на просто | ,

например:

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

Примечание: добавьте /g в конец, чтобы он заменил все вхождения, а не только первое.