Je dois remplacer la chaîne SALT
dans un fichier par le contenu d'un autre fichier. Le problème est que le fichier d'entrée a des multilignes. J'ai essayé quelque chose comme ça dans mon script bash:
SALT=`cat salt.txt`;
sed "s/SALT/$SALT/" wp-config.php > result.txt
Cela fonctionne bien lorsque salt.txt ne comporte qu'une seule ligne, mais s'il y a plus de lignes, il échoue. J'ai lu que cela pourrait faire Perl. Mais je ne sais pas comment. Pourriez-vous m'aider?
Une autre manière Perl
:
Perl -pe 's/SALT/`cat salt.txt`/e' wp-config.php > result.txt
La clé ici est l’option /e
regexp nous permettant d’utiliser un résultat de commande Perl
comme chaîne de substitution.
Si vous voulez vous en tenir à bash
, choisissez un caractère qui n'apparaît ni dans votre chaîne ni dans votre fichier, disons @
; ensuite:
SALT=`< salt.txt tr '\n' '@'`
sed "s/SALT/$SALT/" wp-config.php | tr '@' '\n' > result.txt
Ainsi, avant le remplacement, les caractères newline
de votre chaîne sont remplacés par @
et après le remplacement, les caractères @
sont remplacés par newlines
, de sorte que SALT
n'est plus traité comme un tableau, mais simplement comme une variable contenant une longue chaîne.
Tu peux le faire:
sed -e "/SALT/{r salt.txt" -e "d}" wp-config.php > result.txt
Où salt.txt
est le sel, wp-config.php
est le fichier d'entrée et SALT
est la chaîne à remplacer.
Perl -e 'open my $S, "<", "salt.txt" or die $!;
$salt = do { local $/ ; <$S> };
s/SALT/$salt/, print while <>;
' wp-config.php > result.txt
La première ligne ouvre le salt.txt
.
La deuxième ligne lit le contenu dans la variable $ salt.
Le troisième prend les arguments de la ligne de commande comme noms de fichier, lit les fichiers ligne par ligne et remplace la chaîne.