2012-01-08 5 views
2

J'ai beaucoup de fichiers contenant des données sérialisées php dans lesquelles je dois remplacer certaines chaînes par une autre. L'hôte Linux n'a aucun php installé. Le problème est d'ajuster la chaîne modifiée pour corriger la taille.Script Bash pour modifier les données PHP sérialisées

J'ai essayé quelque chose comme remplacer/chemin de partage/opt:

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

mais le fichier résultat est mauvais: les longueurs sont int expression littérale (taille - 2)

Toute idée?

+0

Vous feriez mieux d'écrire un script php qui fait cela – zerkms

+0

Quelle est votre chaîne et quelle serait votre sortie désirée? –

+0

Vous pouvez rencontrer des problèmes si vous désérialisez autre chose que des scalaires ou des tableaux. – cmbuckley

Répondre

2

Cette solution est pas idéale, mais vous pouvez utiliser Perl:

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

Espérons que je comprends vos besoins correctement. Voici un exemple:

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: Voici un modified script to edit the file in-place with variable search and replace strings.

+0

merci, c'est presque presque ce dont j'ai besoin, mais je ne parle pas perl. Je voudrais que le script prenne 3 arguments: le nom de fichier, la chaîne recherchée, le remplacement. Le script doit modifier le fichier inplace. – fbableus

+0

La sous-chaîne recherchée est-elle toujours au début de la chaîne (c'est-à-dire, si la chaîne non sérialisée est "foobar", voudriez-vous remplacer "barre" par quelque chose)? Et la sous-chaîne recherchée apparaîtra-t-elle dans une seule chaîne sérialisée plus d'une fois (c'est-à-dire en remplaçant "barre" dans "foobarbar")? – cmbuckley

+0

oui la chaîne de recherche est toujours au début de la chaîne sérialisée, le but final est de remplacer les chemins de base, à savoir:/share/doc à/usr/share/doc – fbableus

Questions connexes