Inverte a ordem dos 3 primeiros dígitos de uma linha

1

Estou tentando fazer um trabalho para a universidade, mas atualmente estou preso. O objetivo é ler alguns números de telefone e inverter a ordem dos três primeiros dígitos e colocá-los entre parênteses. Eu consigo ler os números de telefone, mas não faço a reversão dos dígitos.

ex: entrada

214 4234-5555

ex: saída

412 4234-5555

isto é o que eu tenho até agora

sed -r "s/([0-9]), ([0-9]), ([0-9])//g" phone.txt
    
por Soda 19.02.2018 / 04:41

5 respostas

5

Para modificar a tentativa do OP

$ cat ip.txt
214 4234-5555
foo 123 4533-3242

$ sed -r 's/([0-9])([0-9])([0-9])//' ip.txt
412 4234-5555
foo 321 4533-3242

$ # adding parenthesis as well
$ sed -r 's/([0-9])([0-9])([0-9])/()/' ip.txt
(412) 4234-5555
foo (321) 4533-3242

$ # if ERE is not supported
$ sed 's/\([0-9]\)\([0-9]\)\([0-9]\)/()/' ip.txt
(412) 4234-5555
foo (321) 4533-3242
  • Observe que a implementação de sed precisaria de -E em vez de -r
  • Use aspas simples, a menos que você precise de interpolação. Consulte também link
  • ([0-9]), ([0-9]), ([0-9]) significa corresponder 3 dígitos separados por vírgula e espaço
  • g modifier é necessário se todas as correspondências em uma linha forem alteradas


Para uma solução genérica, ou seja, definindo o número de dígitos para reverter como um argumento numérico

$ perl -pe 's/\d{3}/reverse $&/e' ip.txt
412 4234-5555
foo 321 4533-3242
$ perl -pe 's/\d{3}/sprintf "(%s)", scalar reverse $&/e' ip.txt
(412) 4234-5555
foo (321) 4533-3242
    
por 19.02.2018 / 06:03
1

Aqui está um sed muito longo, complicado e provavelmente desnecessário, mas mesmo assim é divertido:

sed -re 'h;    s/^([0-9]*) *(.*)/\n/;  :1 s/(.)(.*\n)//;t1;  s/.//;  s/^(.*)$/\(\)/; x;s/([0-9]{3})(.*)//;x;G;s/\n//'

Isso funciona assim:

      # pretend 214 4234-5555 is the current line
h;    # copy the current line into hold space
s/^([0-9]*) *(.*)/\n/;  # keep only first 3 numbers, 214
:1 s/(.)(.*\n)//;t1;  s/.//;  # reversing string in sed, 
                                  # see notes below; 214 becomes 412
s/^(.*)$/\(\)/;  # After string is reversed, add brackets; (412)
x;s/([0-9]{3})(.*)//; # swap hold and pattern buffer, 
                        # delete first 3 chars; 
                        # pattern space now is <space>4234-5555

x;G;s/\n// # swap again, append hold buffer to pattern buffer; 
            # now pattern buffer is (412)<newline> 4234-5555; 
            # finally delete newline; we get (412) 4234-5555

E é assim que parece em ação:

$ printf "214 4234-5555\n123 3333\n" | sed -re 'h;    s/^([0-9]*) *(.*)/\n/;  :1 s/(.)(.*\n)//;t1;  s/.//;  s/^(.*)$/\(\)/; x;s/([0-9]{3})(.*)//;x;G;s/\n//'
(412) 4234-5555
(321) 3333

Observação : reversão de string encontrada originalmente em Stephane Comentário de Chazelas

    
por 19.02.2018 / 08:47
0
$ n='214 4234-5555'
$ echo 'echo ${n:0:3}|rev'${n:3:9}
412 4234-555
    
por 19.02.2018 / 07:26
0

Método1

Eu usei o método abaixo para obter o mesmo resultado

i='awk '{print $1}' example.txt| rev'
awk -v i="$i" '{print i,$2}' example.txt

Saída

412 4234-5555

Método2

sed  's/\(.\)\(.\)\(.\)//' example.txt

saída

412 4234-5555
    
por 19.02.2018 / 17:04
-3

Se você tem o número em phone.txt como "xxx xxx-xxxx", então você pode usar o seguinte:

! / bin / bash

echo '(' $ (cat phone.txt | corte -d '' -f1 | rev) ')'

    
por 19.02.2018 / 06:25

Tags