引用符内の桁数に基づくデータの解析

引用符内の桁数に基づくデータの解析

現在、現在の形式の大量のデータがあります。

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";};

関連情報