it-swarm.com.de

Ersetzen Sie die Zeichenfolge durch mehrzeiligen Dateiinhalt

Ich muss die Zeichenfolge SALT in einer Datei durch den Inhalt einer anderen Datei ersetzen. Problem ist, dass die Eingabedatei mehrzeilig ist. Ich habe so etwas in meinem Bash-Skript versucht:

SALT=`cat salt.txt`;
sed "s/SALT/$SALT/" wp-config.php > result.txt

Es funktioniert gut, wenn salt.txt eine einzelne Zeile ist, aber wenn mehr Zeilen vorhanden sind, schlägt dies fehl. Ich habe gelesen, dass es Perl tun könnte. Aber ich weiß nicht wie. Kannst du mir helfen?

4
Emetrop

Ein anderer Perl Weg:

Perl -pe 's/SALT/`cat salt.txt`/e' wp-config.php > result.txt

Der Schlüssel hier ist die Option /e regexp, mit der wir ein Perl - Befehlsergebnis als Ersatzzeichenfolge verwenden können.

1
Sylvain Pineau

Wenn Sie sich an bash halten möchten, wählen Sie ein Zeichen, das weder in Ihrer Zeichenfolge noch in Ihrer Datei vorkommt, sagen wir @; dann:

SALT=`< salt.txt tr '\n' '@'`
sed "s/SALT/$SALT/" wp-config.php | tr '@' '\n' > result.txt

Auf diese Weise werden vor dem Ersetzen die Zeichen newline in Ihrer Zeichenfolge in @ und nach dem Ersetzen die Zeichen @ wieder in newlines geändert, sodass SALT wird nicht mehr als Array behandelt, sondern nur noch als Variable, die einen langen String enthält.

1
kos

Du kannst das:

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

Wobei salt.txt das Salt ist, wp-config.php die Eingabedatei ist und SALT die zu ersetzende Zeichenfolge ist

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

Die erste Zeile öffnet den salt.txt.
In der zweiten Zeile wird der Inhalt in die Variable $ salt eingelesen.
Der dritte Befehl verwendet die Befehlszeilenargumente als Dateinamen, liest die Dateien zeilenweise und ersetzt die Zeichenfolge.

0
choroba