Como faço para remover o primeiro caractere em uma coluna específica usando sed

4

Eu tenho o arquivo com a próxima estrutura:

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

Eu preciso remover o primeiro caractere na segunda coluna, Eu tento com sed "s/|.1|/^.\(.*\)//" my_file.txt , mas não funciona, o resultado deve ser:

999963803|81439403|FFF|33
999964211|81823904|FFF|33
999970948|81765738|FFF|33
999971835|81736346|FFF|33
999972780|82127527|FFF|33
    
por Miguel Angel 25.09.2015 / 18:08

4 respostas

1

Este simples awk :

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

OFS define o separador do campo de saída. $2=$2*1 apenas multiplica o segundo campo com 1 ; o zero inicial desaparece.

    
por 25.09.2015 / 19:27
3

com awk:

 awk -F"|" '{print $1"|"substr($2,2)"|"$3"|"$4}' <test
    
por 25.09.2015 / 18:21
3

Com o POSIX sed:

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

O regex [^|][^|]*| significa uma ou mais sequências de caracteres, exceto | , portanto, ele corresponderá a cada um dos campos, exceto o último, você precisa de [^|][^|]*$ para corresponder ao último campo. O comando 2 modifier made s ubstitute só faz a substituição para a segunda correspondência, que é o segundo campo.

Com o GNU ou o BSD sed, você pode simplificar a sintaxe para:

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

( sed -E se tornará padrão na próxima versão POSIX )

    
por 25.09.2015 / 18:20
2

Por que tão complexo?

É o primeiro caractere após o primeiro | , então ...
sed <filename -e 's/|./|/'
... Deveria trabalhar.

Ou seja, encontre o primeiro | e inclua o caractere após ele, substitua apenas por | .

por exemplo:

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

Observação: adicione /g no final para substituir todas as ocorrências, não apenas a primeira.

    
por 25.09.2015 / 18:36