Intereting Posts
Как я могу настроить /etc/kmscon/kmscon.conf для использования определенного шрифта a) и b) раскладки клавиатуры? Получить список файлов, удаленных rm -rf Как префикс выходных данных командной строки с фиксированной строкой? Когти Почта gpg uid grep ключевое слово из вывода Mplayer и отправить остальное в файл Как узнать процесс работы общей библиотеки? Не удалось выполнить атомарную инициализацию SQLite с ошибкой Subversion на Eclipse Thunderbird: новое уведомление по электронной почте не работает должным образом Загрузочный раздел на CentOS 6 Ведение различных мест Dropbox для одной учетной записи Dropbox на разных хостах Убедительный босс, который мне нужен для использования Linux Ручная настройка сетевых интерфейсов на Cubieboard Виртуальный хост по умолчанию для Apache 2.2 для IP-адреса Упаковка Debian: какая разница между патчами и списком изменений? Почему мы используем setid () при демонтизации процесса?

Sed / awk / perl: изменение частей, сохраняющих текст, и выравнивание по столбцу

У меня есть такой текст:

A1JOURNEY0TO1 .BYTE 00, 00, 00 A2JOURNEY0TO2 .BYTE 00, 01, 00 A3JOURNEY1TO0 .BYTE 00, 01, 01 

Мне нужно:

 JOURNEY_01 ; 00 TO 01 .BYTE 00, 00, 00 JOURNEY_02 ; 00 TO 02 .BYTE 00, 01, 00 JOURNEY_03 ; 01 TO 00 .BYTE 00, 01, 01 

и т. д., где «;» должен быть на char 41 строки, а значения, используемые до и после «TO», берутся из текстовых строк в начале строки.

Кто-то может помочь?

Детали этого будут зависеть от того, насколько изменен ваш вход. Если мы можем предположить, что JOURNEY неизменен и что числа, которые вы хотите добавить к нему, никогда не будут больше или меньше двух символов ( 01-99 ), это будет работать:

 perl -pe 's/^.(\d+) ## ignore the first character and capture ## as many digits as possible after it. (.+?) ## Capture everything until the next digit: 'JOURNEY' (\d+)TO(\d+) ## Capture the two groups of digits on ## either side of "TO". / ## End match, begin replacement. "$2_" . ## The 2nd captured group, 'JOURNEY'. sprintf("%.2d",$1) . ## The number, 0-padded. " " x 31 . ## 31 spaces. sprintf("; %.2d TO %.2d",$3,$4) ## The start and end, 0-padded. /ex; ## The 'e' lets us evaluate expressions in the substitution ## operator and the 'x' is only to allow whitespace ## and these explanatory comments ' file 

Вышеупомянутое можно также сконденсировать в:

 perl -pe 's/^.(\d+)(.+?)([\d]+)TO(\d+)/"$2_" . sprintf("%.2d",$1). " " x 31 . sprintf("; %.2d TO %.2d",$3,$4)/e;' file 

Если длины различных строк также являются переменными, вам необходимо учитывать это:

 perl -pe 's/^.+?(\d+)(.+?)([\d]+)TO(\d+)/ "$2_" . sprintf("%.2d",$1) . " " x (41-length(sprintf("%.2d",$1) . "$2_")) . sprintf("; %.2d TO %.2d",$3,$4)/xe;' file 

С awk и угадать, что вы хотите

file ul.awk (отредактировано)

 /JOURNEY/ { jn=substr($1,2,1) ; x=substr($1,10,1) ; y=substr($1,13) ; printf "JOURNEY_%02d%s; %02d TO %02d\n",jn,substr(" ",1,31),x,y ; next ; } {print ;} 

а затем запустить

 awk -f ul.awk u JOURNEY_01 ; 00 TO 01 .BYTE 00, 00, 00 JOURNEY_02 ; 00 TO 02 .BYTE 00, 01, 00 JOURNEY_03 ; 01 TO 00 .BYTE 00, 01, 01 

Это несколько плохое кодирование, поскольку я предполагал, что число всегда будет 1 цифрой.