Sed/awk/perl: 예약된 부분의 텍스트를 수정하고 열에 맞춰 정렬

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

그리고 ";"는 줄의 문자 41에 있어야 하며 "TO" 앞뒤에 사용되는 값은 줄 시작 부분의 텍스트 문자열에서 가져옵니다.

답변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  

답변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자리라고 가정하기 때문에 이것은 일종의 잘못된 코딩입니다.

관련 정보