Sed/Dateien ergänzen

Aus Foxwiki

Dateien ergänzen

Zeile am Dateianfang einfügen

Dies ist auch ohne sed möglich, zum Beispiel mit Hilfe von echo und cat

cat - <<< "Anfang" sed-test.txt > sed-test2.txt
echo "Anfang" | cat - sed-test.txt > sed-test2.txt
echo "Anfang" > sed-test2.txt; cat sed-test.txt >> sed-test2.txt

Mit Hilfe von sed geht dies eleganter.

sed '1iAnfang' < sed-test.txt > sed-test2.txt
* 1=Zeile 1 (explizite Bereichsauswahl)
* i=insert-Befehl

Zeile innerhalb des Textes einfügen

Die folgende Anweisung fügt eine neue Zeile vor der vorletzten Zeile ein.

sed '/vorletzte/idies ist die vorvorletzte Zeile' < sed-test.txt > sed-test2.txt
* /vorletzte/ = Bereichsauswahl über RE
* i=insert-Befehl

Zeile ans Dateiende anhängen

sed '$aEnde' < sed-test.txt > sed-test2.txt
* $=letzte Zeile (explizite Bereichsauswahl)
* a=append-Befehl

Zeichen am Zeilenanfang einfügen

Das Zeichen "#" soll in allen Zeilen an den Zeilenanfang gesetzt werden.

sed 's/^/#/' < sed-test.txt
* s =suchen & ersetzen
* /^/ ="Zeilenanfangszeichen"
* /#/ = Replace-String

Die Anweisung erscheint auf den ersten Blick nicht ganz logisch.

  • Sie ist folgendermaßen zu interpretieren: Ersetze in jeder Zeile das am Zeilenanfang gedachte fiktive "leer-Zeichen" (sozusagen "") durch das #-Zeichen.

Es wird also nicht der Zeilenanfang selbst ersetzt, was ja gar nicht möglich wäre, da es kein Zeilenanfangszeichen analog zum Zeilenendezeichen gibt.

  • Einfacher verständlich wird die Anweisung, wenn man ein bestimmtes Wort am Zeilenanfang ersetzen lässt:
sed 's/^Hier/Dort/' < sed-test.txt 
  • Hier" am Zeilenanfang wird ersetzt durch "Dort"
Beispiel

Das Zeichen "#" soll bei Zeilen, die mit "Hier" beginnen an den Zeilenanfang gesetzt werden.

sed 's/^Hier/#Hier/' < sed-test.txt
Beispiel

Das Zeichen "#" soll in Zeilen, in denen "letzt" vorkommt, an den Zeilenanfang gesetzt werden.

  • Dieser Fall unterscheidet sich von den vorigen, weil das "suchen & ersetzen" auf einen bestimmten Bereich beschränkt werden muss.
  • Hierzu werden geschweifte Klammern verwendet.
sed '/letzt/{s/^/#/}' < sed-test.txt
* /letzt/ =RE; Zeilen, in denen "letzt" vorkommt, werden selektiert
* {s...} = "suchen & ersetzen" wird nur in den selektierten Zeilen ausgeführt