Ersetzen Sie die Zeichenfolge durch mehrzeiligen Dateiinhalt

Ersetzen Sie die Zeichenfolge durch mehrzeiligen Dateiinhalt

Ich muss eine Zeichenfolge SALTin einer Datei durch den Inhalt einer anderen Datei ersetzen. Das Problem ist, dass die Eingabedatei mehrere Zeilen hat. Ich habe in meinem Bash-Skript so etwas ausprobiert:

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

Es funktioniert gut, wenn diesalz.txtist einzeilig, aber wenn es mehr Zeilen sind, schlägt es fehl. Ich habe gelesen, dass es PERL ausführen könnte. Aber ich weiß nicht wie. Können Sie mir helfen?

Antwort1

Ein anderer perlWeg:

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

Der Schlüssel ist hier die Regexp-Option, die es uns ermöglicht, ein Befehlsergebnis als Ersetzungszeichenfolge /ezu verwenden .perl

Antwort2

Wenn Sie bei bleiben möchten bash, wählen Sie ein Zeichen, das weder in Ihrem String 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 die Zeichen in Ihrer Zeichenfolge vor dem Ersetzen newlinein geändert @und nach dem Ersetzen @wieder in newlines, sodass dies SALTnicht mehr als Array, sondern nur als Variable behandelt wird, die eine lange Zeichenfolge enthält.

Antwort3

Du kannst das:

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

Wo salt.txtist das Salt, wp-config.phpist die Eingabedatei und SALTist der zu ersetzende String

Antwort4

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 die salt.txt.
Die zweite Zeile liest deren Inhalt in die Variable $salt.
Die dritte verwendet die Kommandozeilenargumente als Dateinamen, liest die Dateien zeilenweise und ersetzt den String.

verwandte Informationen