Hallo Liste! Ich habe eine Frage: Wie kann ich eine gewisse Zeile aus einem Shellscript löschen? Und wie kann ich eine Zeile an einem gewissen Ort einfügen? Zu ersterem habe ich bereits ein bischen herumprobiert... $ sed -e '1,4d' -e '1,2p' test-file d d e f g aber diese Befehl funktioniert nicht... er gibt mir immer den Rest aus...!? Inhalt von test-file: -------------------- i a b c d e f g -------------------- Das Einfügen habe ich auch ein bischen ausprobiert: $ sed -e '1,4d' -e '1,1i\test-test' test-file test-test d e f g Es ist eigentlich das was ich erwartet habe... aber ich verstehe die Syntax nicht! Warum muss ich '1,1i\test-test' schreiben? Warum dieses 1,1 ?? Ich hoffe auf schnelle Antworten, da ich Morgen in der Schule einen Test über das habe:-) Danke schon im Vorraus! raffael -- Das Verhalten von Gates hatte mir bewiesen, daß ich auf ihn und seine beiden Gefährten nicht rechnen durfte. -- Karl May, Winnetou Bd. 3 ^^^^^^^^ - Bereits Karl May wusste es....
Raffael Schmid wrote:
Hallo Liste!
Ich habe eine Frage:
Wie kann ich eine gewisse Zeile aus einem Shellscript löschen? Und wie kann ich eine Zeile an einem gewissen Ort einfügen?
Zu ersterem habe ich bereits ein bischen herumprobiert...
$ sed -e '1,4d' -e '1,2p' test-file
Schau dir mal diese Seite an: http://www.linuxfibel.de/sed.htm. Ich denke, da wird dir der Umgang mit Sed gut erklärt.
d d e f g
aber diese Befehl funktioniert nicht... er gibt mir immer den Rest aus...!?
Er funktioniert doch wunderbar. (^-^) Was wolltest du denn überhaupt erreichen?
Das Einfügen habe ich auch ein bischen ausprobiert:
$ sed -e '1,4d' -e '1,1i\test-test' test-file test-test d e f g
Es ist eigentlich das was ich erwartet habe... aber ich verstehe die Syntax nicht! Warum muss ich '1,1i\test-test' schreiben? Warum dieses 1,1 ??
Siehe oben, Linuxfibel (^-^) Ich hoffe, du musst nicht auch reguläre Ausdrücke beherrschen, das dauert nämlich meistens etwas, bis man das versteht. Sandy -- Antworten bitte nur in die Mailingliste! PMs bitte an: news-reply2 (@) japantest (.) homelinux (.) com
Sandy Drobic wrote:
Schau dir mal diese Seite an: http://www.linuxfibel.de/sed.htm. Ich denke, da wird dir der Umgang mit Sed gut erklärt. ok, danke! Er funktioniert doch wunderbar. (^-^) Was wolltest du denn überhaupt erreichen? nur eine Zeile ausgeben, wobei das auch total am Ziel vorbeizielt... war wohl ein bischen verwirrt... das Ziel wäre, dass zb. "d" aus der Aufzählung verschwindet...
Es ist eigentlich das was ich erwartet habe... aber ich verstehe die Syntax nicht! Warum muss ich '1,1i\test-test' schreiben? Warum dieses 1,1 ??
Siehe oben, Linuxfibel (^-^) okay:D Ich hoffe, du musst nicht auch reguläre Ausdrücke beherrschen, das dauert nämlich meistens etwas, bis man das versteht. die habe ich mir für PHP schon ein bischen näher gebracht... "sollte" also nicht mehr ein grosses Problem sein...
Grüsse raffael
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hallo, ich hab ein Acer Extensa 4101 WLMi und hab ein Suse10 drauf laufen. Nun hab ich das Problem, das das PowerManagment nicht so richtig fuktioniert. Er erkennt den Status des Akkus nicht und wenn er mit dme Saft am Ende ist, dann macht er einfach aus, was ziemlich unschön ist. Außerdem wollte ich eben das acerhk Package installiern und da bin ich bei der Installationsanleitung bis zu dem Punkt gekommen bis man die kompilierten DAteien in den Kernel Modul Path kopiern soll. Es ist die Datei "acerhk.o" und ich wollte/will sie in das /lib/modules/<kernelversion>/kernel/drivers/char/ kopiern. Aber dort sind nur Dateien mit *.ko und wenn ich dann versuche das Modul zu laden, sagt er mir, das er es nicht findet. Was mach ich falsch?? THX Frank -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.2 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFDfIcIEKdaeQRd2t8RAvfoAKDlhS/kvajvVvCacdkQxuLXkMFJswCcDiES 6EUlJ8BxIETGei3fX/VG2Bs= =x0ja -----END PGP SIGNATURE-----
Frank wrote:
[...] Außerdem wollte ich eben das acerhk Package installiern und da bin ich bei der Installationsanleitung bis zu dem Punkt gekommen bis man die kompilierten DAteien in den Kernel Modul Path kopiern soll. Es ist die Datei "acerhk.o" und ich wollte/will sie in das /lib/modules/<kernelversion>/kernel/drivers/char/ kopiern. Aber dort sind nur Dateien mit *.ko und wenn ich dann versuche das Modul zu laden, sagt er mir, das er es nicht findet.
Was mach ich falsch??
1. Du stellst Fragen zu Laptops (oben weggekuerzt) auf suse-linux, obwohl es suse-laptop gibt, wo die Fragen eigentlich hingehoeren. 2. Du sprichst von Problemen, lieferst aber keine genauen Fehlermeldungen ("er sagt mit, das er es nicht findet"). 3. acerhk.o ist kein 2.6er Kernel-Modul. Kernel-Module haben bei Kernel 2.6 wirklich die Endung *.ko. Irgendwas stimmt mit Deiner Erstellung des Moduls nicht, so wie es aussieht. 4. Eigentlich sollte es nicht noetig sein, ein Kernel-Modul von Hand zu kopieren. Das zugehoerige Makefile sollte das eigentlich fuer Dich erledigen koennen. 5. Es muss ein "depmod -a" laufen, wenn das Kernel-Modul installiert wurde. 6. Du musst dafuer sorgen, dass das Modul bei Bedarf automatisch geladen wird (z.B. via modprobe.conf) oder es beim Booten laden lassen (Eintrag in /etc/sysconfig/kernel). Cheers, Th.
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Thomas Hertweck wrote: > > Frank wrote: >> [...] >> Außerdem wollte ich eben das acerhk Package installiern und da bin ich >> bei der Installationsanleitung bis zu dem Punkt gekommen bis man die >> kompilierten DAteien in den Kernel Modul Path kopiern soll. >> Es ist die Datei "acerhk.o" und ich wollte/will sie in das >> /lib/modules//kernel/drivers/char/ kopiern. Aber dort >> sind nur Dateien mit *.ko und wenn ich dann versuche das Modul zu >> laden, sagt er mir, das er es nicht findet. >> >> Was mach ich falsch?? > > 1. Du stellst Fragen zu Laptops (oben weggekuerzt) auf suse-linux, > obwohl es suse-laptop gibt, wo die Fragen eigentlich hingehoeren. - --> Sorry.. ich wusste nicht, das es ne Suse-Laptop gibt.. Vielen Dank für den Tipp > 2. Du sprichst von Problemen, lieferst aber keine genauen > Fehlermeldungen ("er sagt mit, das er es nicht findet"). - -->Werde das nächste mal konkreter, dachte aber das ich "no such device" mit er findet es nicht richtig geeutet hätte... > 3. acerhk.o ist kein 2.6er Kernel-Modul. Kernel-Module haben bei > Kernel 2.6 wirklich die Endung *.ko. Irgendwas stimmt mit Deiner > Erstellung des Moduls nicht, so wie es aussieht. - ---> Hab den fehler nicht gefunden, wusste nicht, das im 2.6er die Module die Endung *.ko hab.. hab noch mal in der INSTALL geschaut und dort die Option für den 2.6er gefunden > 4. Eigentlich sollte es nicht noetig sein, ein Kernel-Modul von > Hand zu kopieren. Das zugehoerige Makefile sollte das eigentlich > fuer Dich erledigen koennen. - ---> 5. Copy the created file "acerhk.o" ("acerhk.ko" with version 2.6) to your kernel modules path. In Debian this could be "/lib/modules/ /kernel/drivers/char/". > 5. Es muss ein "depmod -a" laufen, wenn das Kernel-Modul installiert > wurde. - --> Das hat ja auch keinen Fehler verursacht THX Frank -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.2 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFDfQulEKdaeQRd2t8RAsz3AJ9cSd02bzb+REY5UW5jaGQOmLnKSgCggvTI Bx6AZvpn0j+33zhvPXnoaF8= =OR2J -----END PGP SIGNATURE-----
Frank wrote:
-->Werde das nächste mal konkreter, dachte aber das ich "no such device" mit er findet es nicht richtig geeutet hätte...
Nein, das ist falsch. Die Meldung besagt nicht, dass der Kernel bzw. modprobe *das Modul* nicht findet (Deine Deutung), sondern dass er *das Geraet (device)* nicht findet. Wie Du daran siehst, sollte man bei Problembeschreibungen *immer* exakte Fehlermeldungen mitliefern.
---> Hab den fehler nicht gefunden, wusste nicht, das im 2.6er die Module die Endung *.ko hab.. hab noch mal in der INSTALL geschaut und dort die Option für den 2.6er gefunden
Sorry, diese Aussage finde ich verwirrend. Hast Du nun im INSTALL eine Anleitung fuer 2.6er Kernel gefunden und dementsprechend ein *.ko Modul erzeugen koennen oder gilt Dein erster Teilsatz, der da lautet "habe den Fehler *nicht* gefunden"...?
---> 5. Copy the created file "acerhk.o" ("acerhk.ko" with version 2.6) to your kernel modules path. In Debian this could be "/lib/modules/<kernelversion>/kernel/drivers/char/".
Ein gutes Makefile sollte ein Target fuer das Installieren des Modules mitbringen und/oder die entsprechende Infrastruktur des Kernel-Makefiles benutzen. Wenn es das nicht gibt, musst Du wohl von Hand kopieren...
[...depmod -a...]
--> Das hat ja auch keinen Fehler verursacht
Ich schrieb ja auch nicht, dass es einen Fehler verursachen soll oder der Grund fuer Deinen Fehler ist, sondern schlicht, dass ein "depmod -a" laufen muss nach der Installation, insbesondere wenn Du die modprobe.conf bzw. .local angepasst hast! :-) Ich vermute fast, dass udev keinen Device-Knoten kreiert in /dev und daher das Kernel-Modul kein Geraet vorfindet. Weisst Du denn, auf welches Device das Modul angewiesen ist? Du solltest zumindest mal einen entsprechenden Eintrag in /etc/modprobe.conf.local machen fuer das block/character device mit der gewissen Major-Nummer... Ob das ein evtl. udev Problem loest, kann ich Dir aber nicht sagen, da blicke ich selbst (noch) nicht so ganz durch. Die Doku zu udev ist etwas, naja, ich nenne es mal, unuebersichtlich. CU, Th.
Hi Raffael, Am Mittwoch, 16. November 2005 20:24 schrieb Raffael Schmid:
Wie kann ich eine gewisse Zeile aus einem Shellscript löschen? Und wie kann ich eine Zeile an einem gewissen Ort einfügen?
Zu ersterem habe ich bereits ein bischen herumprobiert...
$ sed -e '1,4d' -e '1,2p' test-file d d e f g
aber diese Befehl funktioniert nicht... er gibt mir immer den Rest aus...!?
wie kommst du darauf das es nicht funktioniert?
Inhalt von test-file: -------------------- i a b c d e f g --------------------
du sagst beim 1. -e '1,4d' das die Zeilen 1-4 gelöscht werden sollen, das werden sie ja auch (i,a,b,c sind weg, d,e,f,g sind übrig), dann auf die verbliebene (Rest-)Datei die 2. Anweisung ausführen -e '1,2p' das gibt d, danach wird dann der Rest der datei ausgegeben, völlig normal, wenn du alles bis auf zeile 4 löschen willst kannst du zb. sed -e '1,4d' -e '6,$d' machen. man sed Das Gemeine an der Sache ist das in deinem Beispiel (wo die ersten Zeilen ja schon weg sind) die Zählung beim 2. -e bei 1 wieder beginnt, in meinem Beispiel aber die ursprüngliche Zeilennummer für den Bereichsanfang steht.
Das Einfügen habe ich auch ein bischen ausprobiert:
$ sed -e '1,4d' -e '1,1i\test-test' test-file test-test d e f g
Es ist eigentlich das was ich erwartet habe... aber ich verstehe die Syntax nicht! Warum muss ich '1,1i\test-test' schreiben? Warum dieses 1,1 ??
weil das sog. Adressen sind, es wird ein Bereich angegeben und ein Bereich hat immer einen Anfang und ein Ende die in diesem Fall durch Kommata getrennt werden.
Ich hoffe auf schnelle Antworten, da ich Morgen in der Schule einen Test über das habe:-)
eigentlich hätte ich dir erst morgen Antworten sollen ... aber sed versteht man eh nicht in einer Nacht. Gruss Falk
Hallo Falk, Falk Sauer wrote:
wie kommst du darauf das es nicht funktioniert?
ähm, eigentlich sollte er mir die eine Zeile löschen... aber das hast Du ja unten beschrieben....
du sagst beim 1. -e '1,4d' das die Zeilen 1-4 gelöscht werden sollen, das werden sie ja auch (i,a,b,c sind weg, d,e,f,g sind übrig), dann auf die verbliebene (Rest-)Datei die 2. Anweisung ausführen -e '1,2p' das gibt d, danach wird dann der Rest der datei ausgegeben, völlig normal, wenn du alles bis auf zeile 4 löschen willst kannst du zb. sed -e '1,4d' -e '6,$d' machen.
jetzt wirds klarer... danke!
man sed
hmja, mit demselbigen habe ich mir das zusammengeschustert...
weil das sog. Adressen sind, es wird ein Bereich angegeben und ein Bereich hat immer einen Anfang und ein Ende die in diesem Fall durch Kommata getrennt werden.
aha.... ich dachte, das vor dem Kommata sei eine spezielle funktion:P
Ich hoffe auf schnelle Antworten, da ich Morgen in der Schule einen Test über das habe:-)
eigentlich hätte ich dir erst morgen Antworten sollen ... aber sed versteht man eh nicht in einer Nacht.
Was meinst du damit...? Wenn ich das richtig verstehe, dass ich diese Frage früeher stellen sollte?
Gruss Falk
Grüsse rs -- Das Verhalten von Gates hatte mir bewiesen, daß ich auf ihn und seine beiden Gefährten nicht rechnen durfte. -- Karl May, Winnetou Bd. 3 ^^^^^^^^ - Bereits Karl May wusste es....
Hi Raffael, Am Mittwoch, 16. November 2005 21:15 schrieb Raffael Schmid:
eigentlich hätte ich dir erst morgen Antworten sollen ... aber sed versteht man eh nicht in einer Nacht.
Was meinst du damit...? Wenn ich das richtig verstehe, dass ich diese Frage früeher stellen sollte?
sowas Komplexes wie sed oder awk über das schon ganze Bücher geschrieben wurden, schaut man sich nicht erst einen Tag vorm Test an, das ist genauso als würde man versuchen perl in einer Nacht zu lernen. Die Zeilenfunktionen auf die du dich einschiesst sind bei weitem nicht so mächtig und gemein wie die reg-ex features die in sed stecken. Gruss Falk
Hallo Falk, Falk Sauer wrote:
sowas Komplexes wie sed oder awk über das schon ganze Bücher geschrieben wurden, schaut man sich nicht erst einen Tag vorm Test an, das ist genauso als würde man versuchen perl in einer Nacht zu lernen.
Die Zeilenfunktionen auf die du dich einschiesst sind bei weitem nicht so mächtig und gemein wie die reg-ex features die in sed stecken. ok, einverstanden! verstehe ich... aber der Auftrag besteht darin, dass man eine Zeile in ein File schreiben und auch wieder löschen kann.
als ich gegoogelt habe, bin ich auf sed gestossen... so hat sich das dann ergeben. Ich habe also nicht vor über nacht sed auswendig zu können:-) Vielen Dank für die Antworten! Grüsse Raffael
Hallo, Am Wed, 16 Nov 2005, Raffael Schmid schrieb:
Wie kann ich eine gewisse Zeile aus einem Shellscript löschen?
Was ist eine gewisse Zeile? Eine bekannte Zeilennummer? Eine Zeile mit einer bestimmten Zeichenkette? sed -e '4d' # loescht Zeile Nr. 4 sed -e '4,6d' # loescht Zeilen Nr. 4 bis Nr. 6 inkl. sed -e '/REGEX/d' # loescht alle Zeilen, auf die REGEX passt sed -e '/REGEXA/,/REGEXB/d' # loescht alle Zeilen, von jew. einer # Zeile REGEXA bis zur naechsten Zeile REGEXB
Und wie kann ich eine Zeile an einem gewissen Ort einfügen?
sed -e '4i\ Hier dein Text'
Das Einfügen habe ich auch ein bischen ausprobiert:
$ sed -e '1,4d' -e '1,1i\test-test' test-file ^hier fehlt ein Zeilenumbruch!
sed -e '4i\ test-test' test-file Austauschen ist der Befehl 'c' (fuer "change"): Ersetze Zeilen 2-5 durch "bla": sed -e '2,5c\ bla'
Es ist eigentlich das was ich erwartet habe... aber ich verstehe die Syntax nicht!
Lesen. Ausprobieren. Such mal im Archiv dieser ML (u.a. Mails von mir), bei SelfLinux...
Warum muss ich '1,1i\test-test' schreiben? Warum dieses 1,1 ??
Das ist eine Adresse fuer den folgende Befehl 'i'. RTFM: man sed -dnh -- "Funny. Just when you think life can't get any worse, it suddenly does." -- Marvin
participants (6)
-
David Haller
-
Falk Sauer
-
Frank
-
Raffael Schmid
-
Sandy Drobic
-
Thomas Hertweck