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 ?

1voto

sjordi Punkte 19
cat find_replace | while read pattern replacement ; do
sed -i "/${pattern}/c ${replacement}" file    
done 

Die Datei find_replace enthält 2 Spalten, c1 mit dem zu übereinstimmenden Muster, c2 mit der Ersetzung, die sed-Schleife ersetzt jede Zeile, die eines der Muster der Variablen 1 enthält

1voto

The Mauler Punkte 101

Um eine ganze Zeile, die eine bestimmte Zeichenkette enthält, durch den Inhalt dieser Zeile

Textdatei:

Row: 0 last_time_contacted=0, display_name=Mozart, _id=100, phonebook_bucket_alt=2
Row: 1 last_time_contacted=0, display_name=Bach, _id=101, phonebook_bucket_alt=2

Einzelne Saite:

$ sed 's/.* display_name=\([[:alpha:]]\+\).*/\1/'
output:
100
101

Mehrere durch Leerzeichen getrennte Zeichenketten:

$ sed 's/.* display_name=\([[:alpha:]]\+\).* _id=\([[:digit:]]\+\).*/\1 \2/'
output:
Mozart 100
Bach 101

Regex an die eigenen Bedürfnisse anpassen

[:alpha] und [:digit:] sind Zeichenklassen und Klammerausdrücke

1voto

Promise Preston Punkte 15324

Das hat bei mir funktioniert:

sed -i <extension> 's/.*<Line to be replaced>.*/<New line to be added>/'

Ein Beispiel dafür ist:

sed -i .bak -e '7s/.*version.*/      version = "4.33.0"/'
  • -i : Die Erweiterung für die Sicherungsdatei nach der Ersetzung. In diesem Fall ist es .bak .
  • -e : Das sed-Skript. In diesem Fall ist es '7s/.*version.*/ version = "4.33.0"/' . Wenn Sie eine sed-Datei verwenden wollen, benutzen Sie die -f drapeau
  • s : Die Zeilennummer in der zu ersetzenden Datei. In diesem Fall ist es 7s das heißt Zeile 7.

Note :

Wenn Sie eine rekursive Suche und Ersetzung durchführen möchten mit sed dann können Sie grep an den Anfang des Befehls:

grep -rl --exclude-dir=<directory-to-exclude> --include=\*<Files to include> "<Line to be replaced>" ./ | sed -i <extension> 's/.*<Line to be replaced>.*/<New line to be added>/'

0voto

Es ist so ähnlich wie oben..

sed 's/[A-Za-z0-9]*TEXT_TO_BE_REPLACED.[A-Za-z0-9]*/This line is removed by the admin./'

0voto

Ritesh Borkar Punkte 1

Der unten stehende Befehl funktioniert bei mir. Der mit Variablen arbeitet

sed -i "/\<$E\>/c $D" "$B"

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