
Как переместить указанную строку (начинающуюся с 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
операторе действия цикла.
- б) После успешного выполнения регулярного выражения проверяется, что позиция меньше 19. В противном случае цикл прерывается
- а)
Полученные результаты
1 2 3
123456789012345678901234567890
good math234
how are you math123
1234567890
good math234
try this math500
math101 is enough math