Ich habe eine Textdatei, die eine bestimmte Zeile hat
sometext sometext sometext TEXT_TO_BE_REPLACED sometext sometext sometext
Ich muss die ganze Zeile oben durch ersetzen
This line is removed by the admin.
Das Suchwort lautet TEXT_TO_BE_REPLACED
Ich muss dafür ein Shell-Skript schreiben. Wie kann ich das mit erreichen sed
?
Antworten:
Sie können den Befehl change verwenden , um die gesamte Zeile zu ersetzen, und das
-i
Flag, um die Änderungen an Ort und Stelle vorzunehmen. Zum Beispiel mit GNU sed:quelle
c\
wenn direkt eine Variable folgt:…c\$VAR…
Der Backslash entgeht dem Dollar. In diesem Fall I (bash / sed auf Ubuntu 15.10) schreiben mußte…c\\$VAR…
sed -i '' '/TEXT_TO_BE_REPLACED/c\This line is removed by the admin.' /tmp/foo
; (Wenn der erste Parameter leer ist, wird die Datei bearbeitet, andernfalls wird ein Backup erstellt.)Sie müssen
.*
vorher und nachher wildards ( ) verwenden, um die gesamte Zeile zu ersetzen:quelle
sed -i -e "s/.*search_string.*/Replacement_line/' file_being_searched.txt
-i
Option hinzufügenDie akzeptierte Antwort hat bei mir aus mehreren Gründen nicht funktioniert:
-i
mit einer Verlängerung ohne Längec\
Befehls ist seltsam und ich konnte ihn nicht zum Laufen bringenHier ist die Lösung, die ich gefunden habe und die meiner Meinung nach in den meisten Fällen funktionieren sollte:
Die Beispielverwendung zur Behebung des Problems warf also Folgendes auf:
quelle
Die Antwort oben:
Funktioniert einwandfrei, wenn die Ersatzzeichenfolge / -zeile keine Variable ist.
Das Problem ist, dass auf Redhat 5 die
\
nach derc
Flucht die$
. Ein Double\\
hat auch nicht funktioniert (zumindest bei Redhat 5).Durch Treffer und Gerichtsverfahren entdeckte ich, dass die
\
nach derc
überflüssig ist , wenn Ihr Ersatz - String / Zeile nur eine einzige Zeile ist. Also habe ich\
nach dem nicht verwendetc
, eine Variable als einzelne Ersatzzeile verwendet und es war Freude.Der Code würde ungefähr so aussehen:
Beachten Sie die Verwendung von doppelten Anführungszeichen anstelle von einfachen Anführungszeichen.
quelle
Bei allen bisher gegebenen Antworten wird davon ausgegangen, dass Sie etwas über den zu ersetzenden Text wissen, was sinnvoll ist, da dies vom OP verlangt wurde. Ich gebe eine Antwort, die davon ausgeht, dass Sie nichts über den zu ersetzenden Text wissen und dass die Datei möglicherweise eine separate Zeile mit demselben oder einem ähnlichen Inhalt enthält, den Sie nicht ersetzen möchten. Außerdem gehe ich davon aus, dass Sie die Zeilennummer der zu ersetzenden Leitung kennen.
Die folgenden Beispiele zeigen das Entfernen oder Ändern von Text durch bestimmte Zeilennummern:
quelle
zur Manipulation von Konfigurationsdateien
Ich habe diese Lösung gefunden, die von der Skensell-Antwort inspiriert ist
configLine [searchPattern] [replaceLine] [filePath]
es wird:
Funktion:
Die verrückte Magie des Exit-Status kommt von https://stackoverflow.com/a/12145797/1262663
quelle
es funktioniert gut
quelle
In meinem Makefile verwende ich Folgendes:
PS: NICHT Vergessen Sie , dass das -i tatsächlich den Text in der Datei ändert. Wenn sich also das als "Revision" definierte Muster ändert, ändern Sie auch das zu ersetzende Muster.
Beispielausgabe:
Wenn Sie also das Muster "Revision: 1190" festlegen, ist es offensichtlich nicht dasselbe, wie Sie sie als "Revision:" definiert haben ... nur ...
quelle
Die Datei find_replace enthält 2 Spalten, c1 mit passendem Muster, c2 mit Ersetzung. Die sed-Schleife ersetzt jede Zeile, die eines der Muster von Variable 1 enthält
quelle
sed
einmal mit einer Skriptdatei aus, die alle Ersetzungen enthält, die Sie ausführen möchten. Dassed -i
wiederholte Ausführen derselben Datei ist ein schreckliches Antimuster.Es ist so ähnlich wie oben ..
quelle
FOO=TEXT_TO_BE_REPLACED
anFOO=This line ...
nicht erfüllen so die Spezifikation nicht.Der folgende Befehl funktioniert für mich. Welches arbeitet mit Variablen
quelle
Ich benutze sehr oft Regex, um Daten aus Dateien zu extrahieren. Ich habe das nur verwendet, um das wörtliche Zitat
\"
durch//
nichts zu ersetzen :-)quelle