Поменяйте местами первые 3 цифры в строке

Нет - Запущенные процессы не могут делать такие вещи, потому что они основаны на оболочке, и ее задача - сказать, какой процесс находится на переднем плане / на заднем плане / приостановлен.

Попробуйте это - удалите fg , а затем запустите сценарий оболочки в фоновом режиме (то есть с и в конце). По завершении вывод будет выведен на консоль. .

1
19.02.2018, 08:42
4 ответа

Para modificar el intento de OP

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

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

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

$ # if ERE is not supported
$ sed 's/\([0-9]\)\([0-9]\)\([0-9]\)/(\3\2\1)/' ip.txt
(412) 4234-5555
foo (321) 4533-3242
  • Tenga en cuenta que alguna implementación sednecesitaría -Een lugar de-r
  • Use comillas simples a menos que necesite interpolación, vea tambiénhttps://mywiki.wooledge.org/Quotes
  • ([0-9]), ([0-9]), ([0-9])significa hacer coincidir 3 dígitos separados por coma y espacio
  • Se necesita el modificador
  • gsi se deben cambiar todas las coincidencias en una línea


Para una solución genérica, es decir, definir el número de dígitos a invertir como un 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
5
27.01.2020, 23:23

Si tiene el número en phone.txt como "xxx xxx -xxxx", entonces puede usar el siguiente:

!/bin/bash

echo ' ('$ (teléfono gato.txt | cortar -re ' ' -f1 | Rev )' )'

-3
27.01.2020, 23:23

Aquí hay una muy larga, enrevesada y probablemente innecesaria sed, pero aquí es, sin embargo, porque es divertido:

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

Esto funciona así:

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

Y así es como se ve en acción:

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

Nota:Inversión de cadenas encontrada originalmente en comentario de Stephane Chazelas

1
27.01.2020, 23:23

Método 1

He usado el siguiente método para obtener el mismo resultado

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

Salida

412 4234-5555

Método2

sed  's/\(.\)\(.\)\(.\)/\3\2\1/' example.txt

salida

412 4234-5555
0
27.01.2020, 23:23

Теги

Похожие вопросы