sed BACK .. arbeiten mit sed ================ ERSETZEN einer Zeichenvolge: ---------------------------- Es soll die Zeichenvolge [alt] gegen die Zeichenvolge [nagelneu] in der Datei [textgatei.txt] ausgetauscht werden: 1. Moeglichkeit: # sed -e /alt/s//nagelneu/g textdatei.txt # sed 's/alt/nagelneu/g' textdatei.txt 2. Moeglichkeit: # cat textdatei.txt | sed -e /alt/s//neu/g # cat textdatei.txt | sed 's/alt/neu/g' SED arbeitet in diesen Beispielen mit "regular expressions", unter FreeBSD ist eine Beschreibung unter "man re_format" vorhanden. sed mit Sprung: --------------- Hier arbeitet sed die "[Anweisung]" ab und beginnt sie anschliessen von neuem. # sed -e :a -e '[Anweisung];ta' Man kann auch mehrere Anweisungen nacheinander ausfuehren lassen: # sed -e :a -e '[Anweisung1];[Anweisung2];ta' selektiert Bereiche aus einer Datei: ------------------------------------ Zeigt alles aus der Datei ab der ersten Leerzeile # cat [Datei] | sed -e '1,/^$/ d' Zeigt alles aus der Datei bis zur ersten Leerzeile # cat [Datei] | sed -e '/^$/ q' Beispiel: --------- Eine Liste mit den Laendercodes "iso 3166" soll umorganisiert werden: (hier wird auch awk verwendet) # cat iso3166.txt (Im Beispiel nur die ersten 9 Zeilen.) AFGHANISTAN AF AFG 004 ALBANIA AL ALB 008 ALGERIA DZ DZA 012 AMERICAN SAMOA AS ASM 016 ANDORRA AD AND 020 ANGOLA AO AGO 024 ANGUILLA AI AIA 660 ANTARCTICA AQ ATA 010 ANTIGUA AND BARBUDA AG ATG 028 Die ersten 47 Zeichen werden in Anfuehrungszeichen gesetzt: sed -e 's/^.\{47\}/"&"/g' Das "Dach" steht fuer den Zeilenanfang, der Punkt steht fuer ein beliebiges Zeichen und in der geschweiften Klammer steht die Anzahl der beliebigen Zeichen. So wird nach 47 beliebibige Zeichen am Zeilenanfang gesucht, ist eine Zeile kuerzer als 47 Zeichen, wird diese Regel nicht aktiviert. Die Anfuehrungszeichen werden als Spaltentrennzeichen (field separator) verwendet, es werden die zweite und dritte Spalte in umgekehrter Reihenfolge ausgegeben (siehe auch "awk"): awk -F'"' '{print $3" "$2}' Ein paar Zeilen haben am Ende noch zwei Leerzeichen, die abgeschnitten werden sollen, diese Anweisung schneidet all Leerzeichen am Ende einer Zeile ab: sed -e 's/\ *$//g' Das Leerzeichen bedeutet, es wird nach Leerzeichen gesucht. Der Stern steht fuer eine beliebige Anzahl (in diesem Fall) an Leerzeichen. Das Dollarzeichen steht fuer das Zeilenende. So wird nach einer beliebigen Anzahl an Leerzeichen gesucht, die am Zeilenende stehen. # cat iso3166.txt | sed -e 's/^.\{47\}/"&"/g' | awk -F'"' '{print $3" "$2}' | sed -e 's/\ *$//g' AF AFG 004 AFGHANISTAN AL ALB 008 ALBANIA DZ DZA 012 ALGERIA AS ASM 016 AMERICAN SAMOA AD AND 020 ANDORRA AO AGO 024 ANGOLA AI AIA 660 ANGUILLA AQ ATA 010 ANTARCTICA AG ATG 028 ANTIGUA AND BARBUDA [IMG]