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

Используя "~" может не работать в "файлы - из" файла, если rsync не достаточно умен, чтобы распознать и перевести "~" символ.

При определении "~" как части команды в командной строке оболочки это - сама оболочка, которая преобразовывает "~" в корневой каталог прежде, чем передать аргумент программе. Таким образом даже при том, что Вы вводите rsync -a ~/file, что rsync "видит" на самом деле разрешенный путь, или rsync -a /home/foo/file.

Посмотрите Расширение Тильды Bash для получения дополнительной информации.

2
21.11.2018, 00:22
2 ответа

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

файл 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 цифра.

1
27.01.2020, 22:00

Детали будут зависеть от того, насколько переменным является ваш вход. Если мы можем предположить, что 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  
3
27.01.2020, 22:00

Теги

Похожие вопросы