Ich muss eine Zeichenfolge SALT
in 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 perl
Weg:
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 /e
zu 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 newline
in geändert @
und nach dem Ersetzen @
wieder in newlines
, sodass dies SALT
nicht 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.txt
ist das Salt, wp-config.php
ist die Eingabedatei und SALT
ist 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.