Substituir a quarta ocorrência de regex em linha

-1

Esta é a saída que tenho agora. Como posso obter de entrada para saída?

Entrada:

1.2.3.4.5
2.3.4.5.6

Saída:

1.2.3.4-5
2.3.4.5-6

Bônus: Eu tenho os outros 80% do script feito, mas esta é a saída ideal. Existe uma maneira super simples de fazer isso?

Entrada:

1.2.3.4-1.2.3.10

Saída:

1.2.3.4-10
    
por Roboman1723 19.06.2017 / 18:57

3 respostas

1

com awk :

awk -F '[-.]' '{printf "%s.%s.%s.%s-%s\n", $1, $2, $3, $4, $NF}'

Como parece que você deseja que os campos 1-4 e o último campo da entrada sejam separados por . ou - e a saída formatada com todos os campos, exceto o último, separados por . .

Mais concisamente:

awk -F '[-.]' -v OFS=. '{$4 = $4"-"$NF; NF=4}1'
  • Adicione o último campo ao quarto campo e defina o número de campos como 4.
por muru 19.06.2017 / 19:13
0

Primeira parte:

$ sed 's/\./-/4' file.txt

Que substitui a quarta ocorrência de . por - .

Para sua seção de bônus:

sed -r 's/(.*)-.*\.(.*)$/-/' file.txt

entrada:

1.2.3.4-1.2.3.10

saída:

1.2.3.4-10
    
por Ravexina 19.06.2017 / 19:07
0

Podemos usar o agrupamento com correspondência gananciosa com sed assim:

$ sed -r 's/(.*)\.(.*)$/-/' input.txt                                
1.2.3.4-5
2.3.4.5-6

Mesma ideia para o perl:

$ perl -pe's/(.*)\.(.*)$/-/' input.txt                               
1.2.3.4-5
2.3.4.5-6

Mas podemos brincar com . como separador de coluna no awk:

$ awk -F '.' 'BEGIN{OFS=FS}{$NF=-$NF;sub(/\.-/,"-");print}' input.txt        
1.2.3.4-5
2.3.4.5-6
    
por Sergiy Kolodyazhnyy 19.06.2017 / 19:03