【问题标题】:Bash script to alter serialized PHP data用于更改序列化 PHP 数据的 Bash 脚本
【发布时间】:2012-01-08 22:15:33
【问题描述】:

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

我尝试将 /share 路径替换为 /opt:

sed -re 's~s:([0-9]+):"/share([^"]*)~s:int(\1-2):/opt\2~g' file

但结果文件不好:长度是文字表达式 int(size - 2)

有什么想法吗?

【问题讨论】:

  • 你最好写一个 php 脚本来做到这一点
  • 你的字符串是什么样的,你想要的输出是什么?
  • 如果您要反序列化除标量或数组以外的任何内容,您可能会遇到问题。
  • @zerkms : 主机上没有php,文件不只是序列化数据
  • 示例输入和输出会有所帮助。

标签: php bash serialization substitution


【解决方案1】:

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

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

希望我正确理解了您的要求。这是一个例子:

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

编辑:这是modified script to edit the file in-place with variable search and replace strings

【讨论】:

  • 谢谢,这几乎是我需要的,但我不会说 perl。我希望脚本采用 3 个参数:文件名、搜索字符串、替换字符串。该脚本应就地修改文件。
  • 搜索到的子字符串是否总是在字符串的开头(即,如果未序列化的字符串是“foobar”,您是否想用某些东西替换“bar”)?并且搜索到的子字符串是否会多次出现在任何单个序列化字符串中(即替换“foobarbar”中的“bar”)?
  • 是的,搜索字符串总是在序列化字符串的开头,最终目的是替换基本路径,即:/share/doc to /usr/share/doc
  • 很好,我继续做了这两个假设 :-) 编辑中提到的键盘脚本应该可以完成这项工作!
  • 太好了,我只需要将两个长度表达式用括号括起来即可计算差异。 codepad.org/pXmD50hy
猜你喜欢
  • 2015-06-08
  • 1970-01-01
  • 2011-09-28
  • 2017-01-04
  • 2011-07-27
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
相关资源
最近更新 更多