用于更改序列化PHP数据的Bash脚本

用于更改序列化PHP数据的Bash脚本,php,bash,serialization,substitution,Php,Bash,Serialization,Substitution,我有许多包含php序列化数据的文件,其中我必须用另一个字符串替换一些字符串。linux主机没有安装任何php。问题是将修改后的字符串调整为正确的大小 我尝试替换/共享/opt的路径: sed -re 's~s:([0-9]+):"/share([^"]*)~s:int(\1-2):/opt\2~g' file 但是结果文件是错误的:长度是literal expression int(size-2) 有什么想法吗?这个解决方案并不理想,但您可以使用perl: my $line; while ($

我有许多包含php序列化数据的文件,其中我必须用另一个字符串替换一些字符串。linux主机没有安装任何php。问题是将修改后的字符串调整为正确的大小

我尝试替换/共享/opt的路径:

sed -re 's~s:([0-9]+):"/share([^"]*)~s:int(\1-2):/opt\2~g' file
但是结果文件是错误的:长度是literal expression int(size-2)


有什么想法吗?

这个解决方案并不理想,但您可以使用perl:

my $line;
while ($line = <STDIN>) {
    $line =~ s~s:([0-9]+):"/share([^"]*)~"s:".($1-2).":\"/opt$2"~ge;
    print $line;
}

编辑:这里有一个。

您最好编写一个php脚本,这样做您的字符串是什么样子的,您想要的输出是什么?如果您不序列化除标量或数组以外的任何内容,您可能会遇到问题。@zerkms:主机上没有php,这些文件不仅是序列化的dataSample输入和输出会有所帮助。谢谢,这几乎是我所需要的,但我不会说perl。我希望脚本包含3个参数:文件名、搜索字符串和替换字符串。脚本应该就地修改文件。搜索的子字符串是否始终位于字符串的开头(即,如果未序列化的字符串为“foobar”,您是否希望将“bar”替换为其他内容)?搜索的子字符串是否会多次出现在任何一个序列化字符串中(即替换“foobbarr”中的“bar”)?是的,搜索字符串始终位于序列化字符串的开头,最终目的是替换基本路径,即:/share/doc to/usr/share/docNice one,我接着做了两个假设:-)编辑中提到的代码板脚本应该可以完成这项工作!太好了,我只需要把两个长度表达式用括号括起来就可以计算出差值。
php -r 'echo serialize(array("/share/foo")) . "\n";'
a:1:{i:0;s:10:"/share/foo";}

php -r 'echo serialize(array("/share/foo")) . "\n";' | perl replace.pl
a:1:{i:0;s:8:"/opt/foo";}