Ich verwende sed unter Unix, um Text in einer Datei durch Sonderzeichen zu ersetzen. Ich google es und finde den folgenden Befehl
sed 's/from/to/g' file.txt
hier ist „von“ der ursprüngliche Text, der ersetzt wird, „bis“ ist der Ersetzungstext.
Ich versuche dies auf eine Datei mit langem Text mit Sonderzeichen anzuwenden, d.h. ich ersetze "/D/dec/prog/g++.exe -Wall --std=c++0x" (ohne Anführungszeichen) durch "SYSTEM_PATH/BIN". Ich versuche Folgendes, aber es funktioniert nicht
sed 's//D/dec/prog/g++.exe -Wall --std=c++0x/SYSTEM_PATH/BIN/g' file.txt
aber dies führt zu dem Fehler „sed: -e Ausdruck Nr. 1, Zeichen 10: unbekannte Option für ‚s‘“.
Ich bin ein Unix-Anfänger, aber aus irgendeinem Grund muss ich mich remote bei einem Unix-Server anmelden, um einige Dateien zu bearbeiten. Ich möchte wissen
1) Wie kann ich die Von- und Bis-Zeichenfolge in einer Variablen definieren, etwa FROMSTR = '/D/dec/prog/g++.exe -Wall --std=c++0x' TOSTR = 'SYSTEM_PATH/BIN'
so kann ich den sed wie sed 's/$FROMSTR/$TO/g' file.txt aufrufen
aber anscheinend weiß der sed nicht, wie er das als Variable interpretieren soll
2) Nachdem der Text durch sed ersetzt wurde, wird das Ergebnis nicht in die Originaldatei zurückgeschrieben. Wie kann man das wieder hinbekommen?
Antwort1
Der Ersatzbefehl funktioniert nichtbrauchen/
als Trennzeichen verwenden .
sed 's!/D/dec/prog/g++.exe -Wall --std=c++0x!SYSTEM_PATH/BIN!g' file.txt
Antwort2
Befolgen Sie die Anweisungen in der Frage: Stellen Sie zunächst ein, was Sie haben und wodurch es ersetzt werden soll:
(base) localhost:~ # FROMSTR='/D/dec/prog/g++.exe -Wall --std=c++0x'
(base) localhost:~ # echo $FROMSTR
/D/dec/prog/g++.exe -Wall --std=c++0x
(base) localhost:~ # TOSTR='SYSTEM_PATH/BIN'
(base) localhost:~ # echo $TOSTR
SYSTEM_PATH/BIN
Anschließend wird eine Datei erstellt, gegen die der Sed ausgeführt wird.
(base) localhost:~ # cat > testSED
1/D/dec/prog/g++.exe -Wall --std=c++0x1
2/D/dec/prog/g++.exe -Wall --std=c++0x2/D/dec/prog/g++.exe -Wall --std=c++0x2
3/D/dec/prog/g++.exe -Wall --std=c++0x3
Und dann führen Sie sed aus und rufen die Variablen auf. Für die erste müssen wir jedoch echo verwenden:
(base) localhost:~ # sed -e "s|`echo $FROMSTR`|$TOSTR|" testSED
1SYSTEM_PATH/BIN1
2SYSTEM_PATH/BIN2/D/dec/prog/g++.exe -Wall --std=c++0x2
3SYSTEM_PATH/BIN3
(base) localhost:~ # sed -e "s|$FROMSTR|$TOSTR|g" testSED
1SYSTEM_PATH/BIN1
2SYSTEM_PATH/BIN2SYSTEM_PATH/BIN2
3SYSTEM_PATH/BIN3
Damit dies funktioniert, sind einige Dinge erforderlich:
- Ersetzen Sie das von uns gewohnte Sed-Trennzeichen / durch | oder etwas, das Sie in keiner der beiden Variablen verwenden.
- Wenn Sie einfache Anführungszeichen ' verwenden, werden die Variablen als ihr Name und nicht als ihr Inhalt gelesen. $TOSTR wird zu $TOSTR und nicht zu SYSTEM_PATH/BIN.
- Verwenden Sie doppelte Anführungszeichen, um die Variablen interpretieren zu können.
Wenn Sie möchten, dass sed die Datei mit der vorgenommenen Ersetzung neu schreibt, müssen Sie den Sed-Optionen -i hinzufügen. Es wird jedoch empfohlen, die Ausgabe mit > in eine neue Datei umzuleiten.
(base) localhost:~ # sed "s|$FROMSTR|$TOSTR|g" testSED > testSEDdone
(base) localhost:~ # cat testSEDdone
1SYSTEM_PATH/BIN1
2SYSTEM_PATH/BIN2SYSTEM_PATH/BIN2
3SYSTEM_PATH/BIN3
(base) localhost:~ # cat testSED
1/D/dec/prog/g++.exe -Wall --std=c++0x1
2/D/dec/prog/g++.exe -Wall --std=c++0x2/D/dec/prog/g++.exe -Wall --std=c++0x2
3/D/dec/prog/g++.exe -Wall --std=c++0x3
(base) localhost:~ # sed -i "s|$FROMSTR|$TOSTR|g" testSED
(base) localhost:~ # cat testSED
1SYSTEM_PATH/BIN1
2SYSTEM_PATH/BIN2SYSTEM_PATH/BIN2
3SYSTEM_PATH/BIN3