Переместить указанную строку в определенную позицию с помощью sed

Переместить указанную строку в определенную позицию с помощью sed

Как переместить указанную строку (начинающуюся с math) в определенную позицию (20-й столбец) с помощью sed (с regex)? Я хочу переместить строку, начинающуюся с math, в столбец 20 в каждой строке, а строка math всегда находится в последнем слове строки.

how are you math123 
good math234
try this math500 

решение1

Если вы действительнодолжениспользуйте sed, то возможный алгоритм будет заключаться в том, чтобы продолжать добавлять пробелы перед строкой mathдо тех пор, пока предшествующих символов не будет 18 или меньше:

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

Если вы хотите переместить только последнее вхождение строки, то вы можете прикрепить его к концу строки. Например, если задано что-то вроде

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

затемпри условии отсутствия завершающих пробелов

$ 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

Если у вас sedесть расширенный режим регулярных выражений, вы можете упростить его до

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

решение2

В то время как sed не очень хорош в математике, awk в ней преуспевает:

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

Этот код может некорректно обрабатывать возможные критические случаи, но он поможет вам начать работу.

решение3

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

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

Работающий

  • Параметр Perl -pустановит неявный цикл чтения файла построчно. Текущая запись, то есть строка, сохраняется в $_переменной.
  • Цикл whileвыполняет следующие действия:
    • а) /.*\K(?=math)/gработает с текущей строкой $_и regexищет позицию, находящуюся справа от нее, может быть строка «math», а слева — что угодно.
      • б) После успешного выполнения регулярного выражения проверяется, что позиция меньше 19. В противном случае цикл прерывается while.
      • в) Тело цикла whileдобавляет пробел в позицию, определенную в whileоператоре действия цикла.

Полученные результаты

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

Связанный контент