
현재 현재 형식으로 된 많은 양의 데이터가 있습니다.
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";};