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]