2012-01-08 10 views
2

私はいくつかの文字列を別のものに置き換えなければならないPHP直列化データを含む多くのファイルを持っています。 linuxホストにはPHPがインストールされていません。問題は、修正された文字列を修正してサイズを修正することです。シリアル化されたPHPデータを変更するためのBashスクリプト

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

が、結果ファイルが悪いです:

は、私が何かがの/ ​​optに/共有パスを交換したいとしようとした長さがlitteral表現int型(サイズ - 2)です

任意のアイデア?

+0

これを行うPHPスクリプトを記述することをお勧めします – zerkms

+0

あなたの文字列はどのように見えますか、あなたの出力は何でしょうか? –

+0

スカラーや配列以外をシリアル化していない場合は、問題が発生する可能性があります。 – cmbuckley

答えて

2

このソリューションは理想的ではありませんが、あなたは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";} 

EDIT:ここでは一例です。ここmodified script to edit the file in-place with variable search and replace stringsです。

+0

ありがとう、これはほとんど私が必要とするものですが、私はperlを話さない。私は3つの引数を取るスクリプトを望んでいます:ファイル名、検索された文字列、置き換えます。スクリプトは、その場所のファイルを変更する必要があります。 – fbableus

+0

検索された部分文字列は常に文字列の先頭にあります(つまり、シリアル化されていない文字列が「foobar」の場合は、「bar」を何かに置き換えたいですか)。また、検索された部分文字列は、連鎖文字列に複数回表示されます(つまり、 "foobarbar"の "bar"を置き換えます)? – cmbuckley

+0

はい検索文字列は常にシリアライズされた文字列の先頭にあります。最終的な目的は、/ usr/share/docに/ share/docという基本パスを代入することです。 – fbableus

関連する問題