따옴표 안의 자릿수를 기준으로 데이터 구문 분석

따옴표 안의 자릿수를 기준으로 데이터 구문 분석

현재 현재 형식으로 된 많은 양의 데이터가 있습니다.

a:7:{i:0;s:4:"9999";i:1;s:4:"10000";i:2;s:4:"10001";i:3;s:4:"10002";i:4;s:4:"10003";i:5;s:4:"10004";i:6;s:4:"989";}

""그 앞에 있는 숫자에는 가 있습니다 s:4. 3자리 숫자의 경우 이 숫자를 로 변경 s:3하고 5자리 숫자의 경우 s:5다음과 같이 변경해야 합니다.

변환된 데이터는 다음과 같아야 합니다.

a:7:{i:0;s:4:"9999";i:1;s:5:"10000";i:2;s:5:"10001";i:3;s:5:"10002";i:4;s:5:"10003";i:5;s:5:"10004";i:6;s:3:"989";}

각 데이터 문자열은 {}자체 줄에 있습니다.data.txt

답변1

어때?

perl -pe 's/s:\d+:"(.*?)"/sprintf("s:%d:\"%s\"",length($1),$1)/ge'

전.

$ echo 'a:7:{i:0;s:4:"9999";i:1;s:4:"10000";i:2;s:4:"10001";i:3;s:4:"10002";i:4;s:4:"10003";i:5;s:4:"10004";i:6;s:4:"989";}' | 
    perl -pe 's/s:\d+:"(.*?)"/sprintf("s:%d:\"%s\"",length($1),$1)/ge'
a:7:{i:0;s:4:"9999";i:1;s:5:"10000";i:2;s:5:"10001";i:3;s:5:"10002";i:4;s:5:"10003";i:5;s:5:"10004";i:6;s:3:"989";}

-i파일을 현재 위치에서 대체하기 위해 추가할 수 있습니다 .

답변2

#!/usr/bin/env bash

IFS=';'

while read LINE
do

        set -- $LINE

        while [ "$1" ]
        do
                if [[ $1 =~ ^s:[0-9]+:\".*\"$ ]]; then
                        s=${1##*:}
                        printf 's:%d:%s%s' $((${#s}-2)) "$s" "$IFS"
                else
                        printf '%s%s' "$1" "$IFS"
                fi
                shift

        done
        printf '\n'

done < data.txt

이 스크립트는 필드 구분 기호를 세미콜론 문자로 설정한 다음 행을 반복하여 data.txt세미콜론 구분 기호에 따라 각 행을 별도의 필드로 분할합니다. ( 및 s:###:"..."임의 값의 경우 ) 로 시작하는 필드의 경우 스크립트는 인용된 문자열의 길이를 계산하고 해당 길이 값을 사용하고 후행 필드 구분 기호를 추가하여 필드 형식을 다시 지정합니다. 형식과 일치하지 않는 필드는 그대로 출력되며 후행 필드 구분 기호가 다시 추가됩니다.###...s:###:"..."

a:7:{i:0;s:4:"9999";i:1;s:5:"10000";i:2;s:5:"10001";i:3;s:5:"10002";i:4;s:5:"10003";i:5;s:5:"10004";i:6;s:3:"989";};

관련 정보