Используя "~" может не работать в "файлы - из" файла, если rsync не достаточно умен, чтобы распознать и перевести "~" символ.
При определении "~" как части команды в командной строке оболочки это - сама оболочка, которая преобразовывает "~" в корневой каталог прежде, чем передать аргумент программе. Таким образом даже при том, что Вы вводите rsync -a ~/file
, что rsync
"видит" на самом деле разрешенный путь, или rsync -a /home/foo/file
.
Посмотрите Расширение Тильды Bash для получения дополнительной информации.
с 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 цифра.
Детали будут зависеть от того, насколько переменным является ваш вход. Если мы можем предположить, что 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