move a String especificada para uma posição específica usando sed

0

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

how are you math123 
good math234
try this math500 
    
por spiderman 18.05.2017 / 23:12

3 respostas

3

Se você realmente precisar usar sed , um possível algoritmo seria continuar adicionando espaços na frente da string math , desde que haja 18 caracteres ou menos:

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

Se você quiser mover apenas a última ocorrência da string, poderá ancorar 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ão desde que não haja espaço em branco

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

Se o seu sed tiver um modo de expressão regular estendida, você poderá simplificar para

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

Enquanto o sed não é bom em matemática, o awk se destaca:

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

Esse código pode não lidar corretamente com possíveis casos de canto, mas você será iniciado.

    
por 18.05.2017 / 23:23
0
perl -pe 's/(?=math)/" " x (19-length($'))/e'      yourfile

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

Trabalhando

  • A opção Perl -p configurará um loop implícito de leitura em linha, linha a linha. O registro atual, também conhecido como line, é armazenado na variável $_ .
  • O loop while está fazendo o seguinte:
    • a) /.*\K(?=math)/g opera na linha atual, $_ e regex procura a posição, permanecendo onde, apenas à direita pode ser string "math" e para a esquerda é qualquer coisa.
      • b) Após o sucesso do regex, a próxima coisa que é verificada é que a posição é menor que 19. Caso contrário, saia do loop while .
      • c) O corpo do loop while adiciona um espaço na posição que foi determinada na instrução de ação while loop.

Resultados

         1         2         3
123456789012345678901234567890
good               math234
how are you        math123
1234567890
good               math234
try this           math500
math101 is enough  math
    
por 19.05.2017 / 13:07

Tags