
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, math
desde 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ê sed
tiver 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
-p
configurará 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
while
loop está fazendo o seguinte:- a)
/.*\K(?=math)/g
opera na linha atual,$_
e procuraregex
a 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
while
loop. - c) O corpo do
while
loop adiciona um espaço na posição que foi determinada nawhile
instrução de ação do loop.
- 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
- a)
Resultados
1 2 3
123456789012345678901234567890
good math234
how are you math123
1234567890
good math234
try this math500
math101 is enough math