Verschieben Sie die angegebene Zeichenfolge mit sed an eine bestimmte Position

Verschieben Sie die angegebene Zeichenfolge mit sed an eine bestimmte Position

Wie verschiebe ich die angegebene Zeichenfolge (beginnend mit „math“) mithilfe von sed (mit regulärem Ausdruck) an eine bestimmte Position (20. Spalte)? Ich möchte die Zeichenfolge, die mit „math“ beginnt, in jeder Zeile in die Spalte 20 verschieben, und die Zeichenfolge „math“ steht immer im letzten Wort der Zeile.

how are you math123 
good math234
try this math500 

Antwort1

Wenn du wirklichmussverwenden sed, dann wäre ein möglicher Algorithmus, weiterhin Leerzeichen vor der Zeichenfolge einzufügen, mathsolange 18 oder weniger Zeichen vorangehen:

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

Wenn Sie nur das letzte Vorkommen der Zeichenfolge verschieben möchten, können Sie es am Ende der Zeile verankern. Beispielsweise bei etwas wie

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

Dannvorausgesetzt, es gibt keine nachstehenden Leerzeichen

$ 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

Wenn Ihr Computer sedeinen erweiterten regulären Ausdrucksmodus hat, können Sie ihn vereinfachen zu

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

Antwort2

Während sed nicht gut in Mathematik ist, ist awk darin hervorragend:

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

Dieser Code kann mögliche Sonderfälle möglicherweise nicht richtig behandeln, er hilft Ihnen jedoch beim Einstieg.

Antwort3

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

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

Arbeiten

  • Die Perl-Option -prichtet eine implizite Dateileseschleife zeilenweise ein. Der aktuelle Datensatz, auch Zeile genannt, wird in der $_Variable gespeichert.
  • Die whileSchleife macht Folgendes:
    • a) /.*\K(?=math)/garbeitet mit der aktuellen Zeile $_und regexsucht nach der Position, an der sich rechts davon die Zeichenfolge „math“ befinden kann und links davon alles Mögliche.
      • b) Nach dem Erfolg des regulären Ausdrucks wird als nächstes geprüft, ob die Position kleiner als 19 ist. Andernfalls wird die Schleife verlassen while.
      • c) Der Hauptteil der Schleife fügt an der Position, die in der Aktionsanweisung der Schleife whilefestgelegt wurde, ein Leerzeichen ein .while

Ergebnisse

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

verwandte Informationen