Mova a string especificada para uma posição específica usando sed

Mova a string especificada para uma posição específica usando sed

Como mover a string especificada (começando com matemática) para uma posição específica (20ª coluna) usando sed (com regex)? Quero mover a string começando com matemática para a coluna 20 em cada linha e a string matemática está sempre na última palavra da linha.

how are you math123 
good math234
try this math500 

Responder1

Se você realmentedeveuse sed, então um algoritmo possível seria continuar adicionando espaços na frente da string, mathdesde que haja 18 ou menos caracteres anteriores:

$ sed -e :a -e 's/\(^.\{,18\}\)math/\1 math/; ta' file
how are you        math123 
good               math234
try this           math500 

Se quiser mover apenas a última ocorrência da string, você pode ancorá-la no final da linha. Por exemplo, dado algo como

$ cat file
how are you math123
good math234
try this math500
math101 is enough math

entãodesde que não haja espaços em branco à direita

$ sed -e :a -e 's/^\(.\{,18\}\)\(math[^[:space:]]*\)$/\1 \2/; ta' file
how are you        math123
good               math234
try this           math500
math101 is enough  math

Se você sedtiver um modo de expressão regular estendido, você pode simplificar para

sed -E -e :a -e 's/^(.{,18})(math[^[:space:]]*)$/\1 \2/; ta'

Responder2

Embora o sed não seja bom em matemática, o awk é excelente nisso:

$ awk -Fmath '{printf "%-20smath%s\n",$1,$2}' file
how are you         math123 
good                math234
try this            math500 

Este código pode não lidar corretamente com possíveis casos extremos, mas irá ajudá-lo a começar.

Responder3

perl -pe 's/(?=math)/" " x (19-length($`))/e'      yourfile

perl -pe 's// / while /.*\K(?=math)/g && 19 > pos' yourfile

Trabalhando

  • A opção Perl -pconfigurará um loop implícito de leitura de arquivo linha por linha. O registro atual, também conhecido como linha, é armazenado em $_uma variável.
  • O whileloop está fazendo o seguinte:
    • a) /.*\K(?=math)/gopera na linha atual, $_e procura regexa posição, onde, logo à direita pode estar a string "math" e à esquerda está qualquer coisa.
      • b) Após o sucesso da regex, a próxima coisa a verificar é se a posição é menor que 19. Caso contrário, saia do whileloop.
      • c) O corpo do whileloop adiciona um espaço na posição que foi determinada na whileinstrução de ação do loop.

Resultados

         1         2         3
123456789012345678901234567890
good               math234
how are you        math123
1234567890
good               math234
try this           math500
math101 is enough  math

informação relacionada