sed + como deletar o segundo caractere “.” da linha

6

como deletar o segundo caractere "." da linha

o que eu tenho é isso (mas é remover o primeiro "." da saída

uname -r | sed s'/\./ /'

2 6.18-164.2.1.el5PAE

enquanto eu preciso da seguinte saída

2.6 18-164.2.1.el5PAE
    
por maihabunash 05.10.2014 / 15:33

2 respostas

14

Basta adicionar N ao final do comando para que ele corresponda à enésima partida, assim:

uname -r | sed 's/\./ /2'

O que você precisa para isso?

Da página info em sed :

The 's' command can be followed by zero or more of the following FLAGS:

g

Apply the replacement to _all_ matches to the REGEXP, not just the first.

NUMBER

Only replace the NUMBERth match of the REGEXP.
    
por 05.10.2014 / 15:53
1

Aqui estão algumas maneiras de remover o segundo . de uma linha de um arquivo (elas afetarão todas as linhas do arquivo):

  1. sed . Você já tem o que é provavelmente o melhor caminho, mas aqui está outro:

    sed 's/\([^.]*\.[^.]*\)\./ /' file 
    

    Isso procurará o trecho mais longo de não . ( [^.]* ), depois um . ( \. ), o próximo trecho de não . e finalmente um . ( %código%). Os parênteses capturam os padrões para que possamos nos referir a ele como \. . Portanto, o comando acima apenas excluirá o segundo e o substituirá por um espaço.

    Se você tem o GNU . (padrão no Linux), você pode simplificar para:

    sed -r 's/([^.]*\.[^.]*)\./ /' file 
    
  2. Perl

    perl -pe 's/([^.]*\.[^.]*)\./ /' file 
    

    ou

    perl -F'\.' -ane 'print "$F[0].$F[1] ", join ".", @F[2..$#F]' file 
    
  3. sed (tenho certeza de que há uma maneira melhor)

    awk -F. '{printf "%s.%s ",$1,$2; for(i=3;i<NF;i++){printf "%s.",$(i); }print $NF}' file 
    
por 05.10.2014 / 19:22

Tags