Substituindo um caractere em um local específico em um arquivo

0

Eu tenho um arquivo como segue e gostaria de substituir a vírgula na segunda posição por um #:

1K,1,,,,,,,,,,,0.10000000E+00,0.2837726134152E+08,0.6756896377655E+02
1K,2,,,,,,,,,,,0.10000000E+00,0.2837950666514E+08,0.6757007624345E+02
1K,3,,,,,,,,,,,0.10000000E+00,0.2837975330813E+08,0.6756827852038E+02
1K,8,,,,,,,,,,,0.10000000E+00,0.2610685746631E+08,0.1832495587770E+03
1K,9,,,,,,,,,,,0.10000000E+00,0.2610716318002E+08,0.1836118051089E+03
1K10,,,,,,,,,,,0.10000000E+00,0.2609596327361E+08,0.1822385749588E+03
1K11,,,,,,,,,,,0.10000000E+00,0.2610713453046E+08,0.1841214115744E+03
1K12,,,,,,,,,,,0.10000000E+00,0.2610673990054E+08,0.1846882770826E+03
1K18,,,,,,,,,,,0.10000000E+00,0.2610076439025E+08,0.1854595804085E+03

Eu tentei isso, mas excluí os caracteres antes da vírgula:

sed 's/^\(.\{2\}\),/\#/' input_file

Resultado obtido:

#1,,,,,,,,,,,0.10000000E+00,0.2837726134152E+08,0.6756896377655E+02
#2,,,,,,,,,,,0.10000000E+00,0.2837950666514E+08,0.6757007624345E+02
#3,,,,,,,,,,,0.10000000E+00,0.2837975330813E+08,0.6756827852038E+02
#8,,,,,,,,,,,0.10000000E+00,0.2610685746631E+08,0.1832495587770E+03
#9,,,,,,,,,,,0.10000000E+00,0.2610716318002E+08,0.1836118051089E+03
1K10,,,,,,,,,,,0.10000000E+00,0.2609596327361E+08,0.1822385749588E+03
1K11,,,,,,,,,,,0.10000000E+00,0.2610713453046E+08,0.1841214115744E+03
1K12,,,,,,,,,,,0.10000000E+00,0.2610673990054E+08,0.1846882770826E+03
1K18,,,,,,,,,,,0.10000000E+00,0.2610076439025E+08,0.1854595804085E+03

Resultado desejado:

1K#1,,,,,,,,,,,0.10000000E+00,0.2837726134152E+08,0.6756896377655E+02
1K#2,,,,,,,,,,,0.10000000E+00,0.2837950666514E+08,0.6757007624345E+02
1K#3,,,,,,,,,,,0.10000000E+00,0.2837975330813E+08,0.6756827852038E+02
1K#8,,,,,,,,,,,0.10000000E+00,0.2610685746631E+08,0.1832495587770E+03
1K#9,,,,,,,,,,,0.10000000E+00,0.2610716318002E+08,0.1836118051089E+03
1K10,,,,,,,,,,,0.10000000E+00,0.2609596327361E+08,0.1822385749588E+03
1K11,,,,,,,,,,,0.10000000E+00,0.2610713453046E+08,0.1841214115744E+03
1K12,,,,,,,,,,,0.10000000E+00,0.2610673990054E+08,0.1846882770826E+03
1K18,,,,,,,,,,,0.10000000E+00,0.2610076439025E+08,0.1854595804085E+03
    
por eric 14.11.2017 / 09:42

4 respostas

1

Na verdade, a vírgula , que precisa ser substituída por # está na posição 3 :

sed 's/^\(..\),/#/' input_file
  • ^ - início da âncora da string

  • (..) - o primeiro grupo capturado contendo os primeiros 2 caracteres

  • - referência ao primeiro grupo capturado

A saída:

1K#1,,,,,,,,,,,0.10000000E+00,0.2837726134152E+08,0.6756896377655E+02
1K#2,,,,,,,,,,,0.10000000E+00,0.2837950666514E+08,0.6757007624345E+02
1K#3,,,,,,,,,,,0.10000000E+00,0.2837975330813E+08,0.6756827852038E+02
1K#8,,,,,,,,,,,0.10000000E+00,0.2610685746631E+08,0.1832495587770E+03
1K#9,,,,,,,,,,,0.10000000E+00,0.2610716318002E+08,0.1836118051089E+03
1K10,,,,,,,,,,,0.10000000E+00,0.2609596327361E+08,0.1822385749588E+03
1K11,,,,,,,,,,,0.10000000E+00,0.2610713453046E+08,0.1841214115744E+03
1K12,,,,,,,,,,,0.10000000E+00,0.2610673990054E+08,0.1846882770826E+03
1K18,,,,,,,,,,,0.10000000E+00,0.2610076439025E+08,0.1854595804085E+03
    
por 14.11.2017 / 09:50
1
sed 's/^\(..\),\([0-9]\)/#/' input_file

Parece que você não está familiarizado com o regexp. Esta questão é tão fácil quanto uma pergunta não-deveria ser feita.

    
por 14.11.2017 / 09:55
0
use below command to get the desired result

input file u.txt

1K,1,,,,,,,,,,,0.10000000E+00,0.2837726134152E+08,0.6756896377655E+02
1K,2,,,,,,,,,,,0.10000000E+00,0.2837950666514E+08,0.6757007624345E+02
1K,3,,,,,,,,,,,0.10000000E+00,0.2837975330813E+08,0.6756827852038E+02
1K,8,,,,,,,,,,,0.10000000E+00,0.2610685746631E+08,0.1832495587770E+03
1K,9,,,,,,,,,,,0.10000000E+00,0.2610716318002E+08,0.1836118051089E+03
1K10,,,,,,,,,,,0.10000000E+00,0.2609596327361E+08,0.1822385749588E+03
1K11,,,,,,,,,,,0.10000000E+00,0.2610713453046E+08,0.1841214115744E+03
1K12,,,,,,,,,,,0.10000000E+00,0.2610673990054E+08,0.1846882770826E+03
1K18,,,,,,,,,,,0.10000000E+00,0.2610076439025E+08,0.1854595804085E+03


command: sed "s/,/#/1" u.txt

sed "s/,/#/1" u.txt 
1K#1,,,,,,,,,,,0.10000000E+00,0.2837726134152E+08,0.6756896377655E+02
1K#2,,,,,,,,,,,0.10000000E+00,0.2837950666514E+08,0.6757007624345E+02
1K#3,,,,,,,,,,,0.10000000E+00,0.2837975330813E+08,0.6756827852038E+02
1K#8,,,,,,,,,,,0.10000000E+00,0.2610685746631E+08,0.1832495587770E+03
1K#9,,,,,,,,,,,0.10000000E+00,0.2610716318002E+08,0.1836118051089E+03
1K10#,,,,,,,,,,0.10000000E+00,0.2609596327361E+08,0.1822385749588E+03
1K11#,,,,,,,,,,0.10000000E+00,0.2610713453046E+08,0.1841214115744E+03
1K12#,,,,,,,,,,0.10000000E+00,0.2610673990054E+08,0.1846882770826E+03
1K18#,,,,,,,,,,0.10000000E+00,0.2610076439025E+08,0.1854595804085E+03
    
por 14.11.2017 / 10:06
0

Se você puder criar um padrão no qual cada "K", aparência deve ser "K #", você pode fazer a seguinte substituição sed :

sed 's/K,/K#/g' input_file
    
por 14.11.2017 / 12:09