Mueva la cadena especificada a una posición específica usando sed

Mueva la cadena especificada a una posición específica usando sed

¿Cómo mover la cadena especificada (comenzando con matemáticas) a una posición específica (columna 20) usando sed (con expresiones regulares)? Quiero mover la cadena que comienza con matemáticas a la columna 20 en cada línea y la cadena matemática siempre está en la última palabra de la línea.

how are you math123 
good math234
try this math500 

Respuesta1

Si tú realmentedebeuse sed, entonces un posible algoritmo sería seguir agregando espacios delante de la cadena mathsiempre que haya 18 o menos caracteres anteriores:

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

Si desea mover solo la última aparición de la cadena, puede anclarla al final de la línea. Por ejemplo, dado algo como

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

entoncessiempre que no haya espacios en blanco al final

$ 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

Si sedtiene un modo de expresión regular extendido, puede simplificarlo a

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

Respuesta2

Si bien sed no es bueno en matemáticas, awk sobresale en ellas:

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

Es posible que este código no maneje correctamente posibles casos extremos, pero lo ayudará a comenzar.

Respuesta3

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

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

Laboral

  • La opción Perl -pconfigurará un archivo implícito leído en bucle línea por línea. El registro actual, también conocido como línea, se almacena en $_una variable.
  • El whilebucle está haciendo lo siguiente:
    • a) /.*\K(?=math)/gopera en la línea actual $_y busca regexla posición, donde, justo a su derecha puede estar la cadena "matemáticas" y a su izquierda cualquier cosa.
      • b) Tras el éxito de la expresión regular, lo siguiente que se verifica es que la posición sea menor que 19. De lo contrario, salga del whilebucle.
      • c) El cuerpo del whilebucle agrega un espacio en la posición determinada en la whiledeclaración de acción del bucle.

Resultados

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

información relacionada