web-dev-qa-db-fra.com

Remplacer la chaîne par le contenu d'un fichier multiligne

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?

4
Emetrop

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.

1
Sylvain Pineau

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.

1
kos

Tu peux le faire:

sed -e "/SALT/{r salt.txt" -e "d}" wp-config.php  > result.txt

salt.txt est le sel, wp-config.php est le fichier d'entrée et SALT est la chaîne à remplacer.

1
Helio
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.

0
choroba