440 Stimmen

Ersetzen einer ganzen Zeile mit einer Zeichenkette durch Sed

Ich habe eine Textdatei, die eine bestimmte Zeile enthält, etwa so

sometext sometext sometext TEXT_TO_BE_REPLACED sometext sometext sometext

Ich muss die ganze Zeile oben ersetzen durch

This line is removed by the admin.

Der Suchbegriff lautet TEXT_TO_BE_REPLACED

Ich muss dafür ein Shell-Skript schreiben. Wie kann ich dies erreichen mit sed ?

639voto

Todd A. Jacobs Punkte 75903

Sie können die ändern um die gesamte Zeile zu ersetzen, und der Befehl -i Flagge, um die Änderungen an Ort und Stelle vorzunehmen. Zum Beispiel mit GNU sed:

sed -i '/TEXT_TO_BE_REPLACED/c\This line is removed by the admin.' /tmp/foo

211voto

Thor Punkte 42021

Sie müssen Wildcards verwenden ( .* ) vor und nach, um die gesamte Zeile zu ersetzen:

sed 's/.*TEXT_TO_BE_REPLACED.*/This line is removed by the admin./'

30voto

user4256255 Punkte 371

Die Antwort oben:

sed -i '/TEXT_TO_BE_REPLACED/c\This line is removed by the admin.' /tmp/foo

Funktioniert gut, wenn die Ersatzzeichenfolge/Zeile keine Variable ist.

Das Problem ist, dass unter Redhat 5 die \ nach dem c entgeht dem $ . Ein Doppel \\ funktionierte ebenfalls nicht (zumindest unter Redhat 5).

Durch Versuch und Irrtum habe ich herausgefunden, dass die \ nach dem c ist überflüssig, wenn Ihre Ersetzungszeichenfolge/Zeile nur aus einer einzigen Zeile besteht. Ich habe also nicht verwendet \ nach dem c eine Variable als einzelne Ersetzungszeile verwendet, und es war eine Freude.

Der Code würde etwa so aussehen:

sed -i "/TEXT_TO_BE_REPLACED/c $REPLACEMENT_TEXT_STRING" /tmp/foo

Beachten Sie die Verwendung von doppelten Anführungszeichen anstelle von einfachen Anführungszeichen.

24voto

skensell Punkte 1393

Die akzeptierte Antwort hat für mich aus mehreren Gründen nicht funktioniert:

  • meine Version von sed mag nicht -i mit einer Verlängerung der Länge Null
  • die Syntax der c\ Befehl ist seltsam und ich konnte ihn nicht zum Laufen bringen
  • Mir war nicht klar, dass einige meiner Probleme von nicht abgeschnittenen Schrägstrichen herrühren

Hier ist also die Lösung, die ich mir ausgedacht habe und die meiner Meinung nach in den meisten Fällen funktionieren sollte:

function escape_slashes {
    sed 's/\//\\\//g' 
}

function change_line {
    local OLD_LINE_PATTERN=$1; shift
    local NEW_LINE=$1; shift
    local FILE=$1

    local NEW=$(echo "${NEW_LINE}" | escape_slashes)
    # FIX: No space after the option i.
    sed -i.bak '/'"${OLD_LINE_PATTERN}"'/s/.*/'"${NEW}"'/' "${FILE}"
    mv "${FILE}.bak" /tmp/
}

So die Probe Verwendung, um das Problem zu beheben aufgeworfen:

change_line "TEXT_TO_BE_REPLACED" "This line is removed by the admin." yourFile

10voto

b_laoshi Punkte 405

Alle bisherigen Antworten setzen voraus, dass Sie etwas über den zu ersetzenden Text wissen, was sinnvoll ist, da dies die Frage des Auftraggebers ist. Ich gebe eine Antwort, die davon ausgeht, dass Sie nichts über den zu ersetzenden Text wissen und dass es eine separate Zeile in der Datei mit demselben oder einem ähnlichen Inhalt geben könnte, die nicht ersetzt werden soll. Außerdem gehe ich davon aus, dass Sie die Zeilennummer der zu ersetzenden Zeile kennen.

Die folgenden Beispiele zeigen das Entfernen oder Ändern von Text anhand bestimmter Zeilennummern:

# replace line 17 with some replacement text and make changes in file (-i switch)
# the "-i" switch indicates that we want to change the file. Leave it out if you'd
#   just like to see the potential changes output to the terminal window.
# "17s" indicates that we're searching line 17
# ".*" indicates that we want to change the text of the entire line
# "REPLACEMENT-TEXT" is the new text to put on that line
# "PATH-TO-FILE" tells us what file to operate on
sed -i '17s/.*/REPLACEMENT-TEXT/' PATH-TO-FILE

# replace specific text on line 3
sed -i '3s/TEXT-TO-REPLACE/REPLACEMENT-TEXT/'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X