Kategorie: Bash Snippets

  • Variablen bei sed-Ausdrücken

    Problem: Beim Suchen und Ersetzen eines Strings in einer Textdatei mit dem Linux-Programm sed (Stream Editor) trat das Problem auf, dass bei der Verwendung von Shellvariablen als Suchmuster der gewünschte Text, also der Wert der Variablen, nicht durch den Zieltext ersetzt wurde. Ein Test ohne Variablen funktionierte aber ohne Probleme.

    sed ’s/suchmuster/zieltext/g‘ Eingabedatei > Ausgabedatei
    mv Ausgabedatei Eingabedatei

    ersetzte den Text „suchmuster“ in der „Eingabedatei“ mit dem Text „zieltext“ und schrieb das Ergebnis in die „Ausgabedatei“.

    Folgendes funktionierte aber nicht:

    suchmuster=“das ist der quelltext“
    zieltext=“das ist der zieltext“
    sed ’s/$suchmuster/$zieltext/g‘ Eingabedatei > Ausgabedatei
    mv Ausgabedatei Eingabedatei

    Der Text „das ist der quelltext“ wurde nicht durch den Text „das ist der zieltext“ ersetzt.

    Lösung: Durch eine Suchmaschinenrecherche fand ich die Lösung. Sed wertet den Inhalt von Variablen nicht aus, wenn man einfache Anführungszeichen (‚) beim Erstellen des Ausdrucks verwendet. Ersetzt man die einfachen Anführungszeichen durch doppelte Anzührungszeichen („), werden zuerst die Variablen expandiert und dann erst der Sed-Ausdruck ausgeführt.

    Der funktionierende Code sah dann so aus:

    suchmuster=“das ist der quelltext“
    zieltext=“das ist der zieltext“
    sed s/$suchmuster/$zieltext/g Eingabedatei > Ausgabedatei
    mv Ausgabedatei Eingabedatei

    Quelle: http://www.unixboard.de

  • Bash: Löschen von Zeilen aus einer Datei, die ein bestimmtes Suchmuster enthalten

    Das Löschen von bestimmten Zeilen aus einer Datei kann mithilfe einer temporären Datei und dem Kommandozeilentool grep geschehen. Grep gibt alle Zeilen einer Textdatei aus, die einem bestimmten Suchmuster entsprechen. Die Option -v von grep negiert die Ausgabe von grep. Es werden dann nur Zeilen einer Datei ausgegeben, die ein bestimmtes Suchmuster nicht enthalten. Die Ausgabe auf dem Bildschirm kann man nun in eine temporäre Datei umleiten. Im Anschluss daran kann man die Originaldatei mit der temporären Datei überschreiben. Nun hat man eine Datei, aus der diejenigen Zeilen entfernt wurden, die ein bestimmtes Suchmuster enthielten.

    grep -v  suchmuster originaldatei > tempdatei
    mv tempdatei originaldatei