Ich versuche diesen Befehl auszuführen
sed -i -e "s/BASE_64/$BASE_64/" FILE_NAME
Dabei $BASE_64
handelt es sich um eine Basis-64-Darstellung eines Dateiinhalts.
sed
gibt mir einen Fehler, da die Zeichenfolge zu lang ist.
Argumentliste zu lang
Wie kann dieser Fehler vermieden werden?
bash
shell-script
sed
Lorenzo B.
quelle
quelle
BASE64
nur ein Teil der Leitung ist und Sie nicht die gesamte Leitung ersetzen möchten?/BASE64/r base64.txt
Einfügung wie oben machen und danns/BASE64//
eher als/BASE64/d
.s/BASE_64/$BASE_64_TEXT/
mit sed oder ed oder perl oder was auch immer würde wahrscheinlich ausreichen.Sie können dies immer tun (da Sie GNU
sed
bereits verwenden (-i
)):-f -
sagtsed
, dass das sed-Skript von stdin gelesen werden soll.Wenn Sie das gleiche Skript für mehrere Dateien wieder zu verwenden, auf Linux (und nur Linux), mit einer Schale wie
bash
,zsh
,ksh
dass die Geräte hier Dokumente mit temporären Dateien (im Gegensatz zu Rohren entgegengesetzt wiedash
oderyash
) und immer noch mit GNUsed
, könnten Sie tun:Unter Linux (und nur unter Linux)
/dev/stdin
bedeutet dies nicht, dass stdin auf die gleiche Weise-
funktioniert. Stattdessen ist es ein Symlink zu der auf stdin geöffneten Datei. Jedes Malsed
, wenn sie geöffnet wird, wird die Datei von Anfang an neu geöffnet. Der obige Befehl würde auf anderen Systemen (mit/dev/stdin
) oder mit Shells, die hier Dokumente mit Pipes implementieren, einwandfrei funktionieren, jedoch nur, wenn nur wenigeconf
Dateien vorhanden sind,sed
die nur einmal aufgerufen werden. Wenn das zweite Mal aufgerufen, auf Nicht-Linux - Systemen, wie mit-f -
,/dev/stdin
scheint leer , da es bereits durch den ersten Aufruf gelesen wurde.busybox
sed
unterstützt-i
auf die gleiche Weise wie GNUsed
, unterstützt jedoch nicht-f -
. Sie möchten-f /dev/stdin
es also auf jeden Fall dort verwenden.sed
Verwenden Sie mit FreeBSD :quelle
Eine andere Möglichkeit wäre, zu ersetzen ,
sed
mited
und speichern Sie Ihre Befehle in einer Datei. Zum Beispiel, wenn Sieed_cmds
mit folgenden Inhalten erstellen :du könntest dann rennen
und es würde die gewünschten Änderungen vornehmen, sodass Sie anstelle der Einstellung
$BASE_64
die Befehlsdatei ed erstellen würden.Ed Erklärung
%
bedeutet, den Befehl auf jede Zeile der Datei anzuwendens/pat1/pat2/g
Ersatzvorkommen vonpat1
mitpat2
undg
am Ende macht es für jedes Spiel auf der Linie, nicht nur für das erstew
Schreiben Sie die Änderungen auf die Festplatteq
Beenden (was passieren würde, wenn es sowieso EOF bekommen würde)Natürlich können Sie Ihre
sed
Befehle in eine Datei einfügen und auch verwenden.-f
Wenn Sie dies jedoch tun und die Datei an Ort und Stelle ändern möchten, können Sie sie auch verwenden,ed
anstatt eine temporäre Datei zu erstellen und sie wiesed -i
folgt zu verschieben.quelle
Die Größe der Base64-Darstellung der Datei ($ BASE_64) ist zu lang und überschreitet die maximale Argumentgröße. Sie sollten in der Lage sein, dieses Limit für Ihr System zu sehen, indem Sie es ausführen
Sie müssen den
ARG_MAX
Wert vergrößern . Aber ich denke, wenn die Datei zu groß ist, müssen Sie einen anderen Ansatz verwenden, um diesen Ersatz durchzuführen. Wenn ein Python-Skript es für Sie tun würde, würde ich es auch damit versuchen.quelle
ARG_MAX
dort nicht einmal hilft.Am Ende habe ich die
sed
Anweisungen in eine Datei geschriebenund angerufen
Das ist gut, wenn Sie nicht verwenden
sed -i
. Wenn Sie die Datei an Ort und Stelle bearbeiten möchten, folgen Sie https://unix.stackexchange.com/a/284188/149867 und fügen Sie die entsprechendened
Anweisungen in eine Datei ein, gefolgt vonw
undq
.quelle
-i
funktioniert gut mit-f
. Stellen Sie nur sicher, dass Sie-i -f
(oder-i '' -f
mit BSDsed
) verwenden, nicht-if
. Sie können auch verwenden-f -
, um die temporäre Datei zu vermeiden.