sed, a stream editor

doe

Active Member
Kennt sich jemand mit sed aus?

Ich möchte in der Hosts-Datei eine Textzeile löschen, aber das will einfach nicht funktionieren.
Meine Eingabe:
sed '/12.34.56.78 mail.knecht.de/d' ./hosts
erzeugt nur Systax Error. Ach so, das Gnu läuft unter Windows.

edit: nicht systax error, aber eine Fehlermeldung
 
http://mikiwiki.org/wiki/sed#Option_.22d.22

E:\WINDOWS\system32\drivers\etc>sed '/^10.8.8.1/d' hosts
sed: -e expression #1, char 1: unknown command: `''
theoth;n8945 said:
Syntax is korrekt - versuch doch mal, ob 's/12.34.56.78 mail.knecht.de//' geht - wird dann durch eine leere Zeile ersetzt.

du schreibst das s zu Beginn der Adresse, ähm

Getestet. Egal, was ich eingebe, er sagt immer
sed: -e expression #1, char 1: unknown command: `''
Sieht wohl nach einem anderen Problem aus.
 
ja, wird wie bei vi gemacht: s/string1/string2/ - Du kannst auch mal statt ' " verwenden und bei d reicht ein String der matched, also das ^ muß nicht.
Auch statt / kannst Du jeden char verwenden, der nicht in dem String vorkommt, also : oder % usw. Vielleicht ist das cygwin ja nur eingeschränkt kompatibel
 
also " anstatt ' macht einen Unterschied.

Z.B. gibt der Befehl
sed "/^10.8.8.1/d" E:\WINDOWS\system32\drivers\etc\hosts
Den Inhalt der Hostsdatei aus, ohne die 10er IP,
schaue ich aber in der Hosts nach, ist die Zeile mit der 10er IP immer noch existent.
Gemacht hat er wohl nichts.
 
doe;n8949 said:
also " anstatt ' macht einen Unterschied.

Z.B. gibt der Befehl
sed "/^10.8.8.1/d" E:\WINDOWS\system32\drivers\etc\hosts
Den Inhalt der Hostsdatei aus, ohne die 10er IP,
schaue ich aber in der Hosts nach, ist die Zeile mit der 10er IP immer noch existent.
Gemacht hat er wohl nichts.

Nein, er macht auch nichts. Die Ausgabe geht einfach nach stdout.
Du mußt den output abspeichern und anschließend an die Stelle der hosts kopieren.

Bin aber nicht sicher, ob z.B cat /etc/hosts | sed "bla" > /etc/hosts funktionieren würde (unter Linux geht's nicht)
 
Das ist das beste Ergebnis, darauf sollte man vielleicht aufbauen :)
Das Ziel ist immer noch: eine Zeile löschen.

Viel verstehe ich von dem Ding noch nicht, aber die Optionen d und s haben m.E. das Potenzial, mich glücklich zu machen.
Das e hingegen löst keine guten Gefühle aus :)
Bei Windows ist nicht zu vergessen, dass / eigentlich ein \ sein muss, wenn es um Verzeichnisangaben geht, oder?
 
Ich glaube cygwin übernimmt das für Dich und tauscht / gegen \ aus. Ausprobieren...
sed ist ziemlich cryptisch und die expressions sind teilweise kompliziert. awk ist für viele komplexere Zwecke vielleicht etwas einfacher.
 
doe;n8949 said:
...
schaue ich aber in der Hosts nach, ist die Zeile mit der 10er IP immer noch existent.
Gemacht hat er wohl nichts.[/FONT][/FONT]
Per Zufall entdeckt: option -i macht das replacement "in place". Hab ich bislang auch noch nicht gewußt/gebraucht
 
E:\WINDOWS\system32\drivers\etc>sed '/10.20.30.40 mail.server.com/i' ./hosts.tst
sed: -e expression #1, char 1: unknown command: `''

E:\WINDOWS\system32\drivers\etc>sed -i "10.20.30.40 mail.server.com" hosts.tst
sed: -e expression #1, char 3: unknown command: `.'

hosts.tst enthält die Zeile 10.20.30.40 mail.server.com


Es mag mich nicht :-(
Ob es an der Version liegt?


E:\WINDOWS\system32\drivers\etc>sed --version
GNU sed version 4.2.1
Copyright (C) 2009 Free Software Foundation, Inc.


E:\>sed
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

-n, --quiet, --silent
suppress automatic printing of pattern space
-e script, --expression=script
add the script to the commands to be executed
-f script-file, --file=script-file
add the contents of script-file to the commands to be executed
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if extension supplied)
-b, --binary
open files in binary mode (CR+LFs are not processed specially)
-c, --copy
use copy instead of rename when shuffling files in -i mode
(avoids change of input file ownership)
-l N, --line-length=N
specify the desired line-wrap length for the `l' command
--posix
disable all GNU extensions.
-r, --regexp-extended
use extended regular expressions in the script.
-s, --separate
consider files as separate rather than as a single continuous
long stream.
-u, --unbuffered
load minimal amounts of data from the input files and flush
the output buffers more often
--help display this help and exit
--version output version information and exit

If no -e, --expression, -f, or --file option is given, then the first
non-option argument is taken as the sed script to interpret. All
remaining arguments are names of input files; if no input files are
specified, then the standard input is read.

GNU sed home page: .
General help using GNU software: .
 
Back
Top