View previous topic :: View next topic |
Author |
Message |
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Thu Sep 18, 2008 6:27 pm Post subject: Suchen und ersetzen in Dateien? |
|
|
Hallo Zusammen,
ich habe mal wieder ein Problem.
Ich möchte in einer Datei Zeilen suchen lassen die z.B mit: abcd123 beginnen und dann mit einem anderen Eintrag ersetzen.
Ich habe auch schon mit sed experimentiert, jedoch leider erfolglos.
Das Problem ist, dass die Zeilen die ich einfügen möchte, u.U Steuerzeichen enthalten können.
Beispiel:
Suche in Datei blabla.txt nach der Zeile die mit abcd123 beginnt und ersetze diese durch abcd&1$2=3#"$"4
Hat von Euch einer eine Idee, wie man das lösen könnte?
Ich bin über jeden Vorschlag dankbar. |
|
Back to top |
|
|
firefly Watchman
Joined: 31 Oct 2002 Posts: 5182
|
Posted: Thu Sep 18, 2008 7:20 pm Post subject: |
|
|
durch escapen der steuerzeichen
Code: | -> cat blabla.txt
abcd123
-> sed -e 's/abcd123/abcd\&1\$2\=3#\"\$\"4/g' blabla.txt
abcd&1$2=3#"$"4 |
_________________ Ein Ring, sie zu knechten, sie alle zu finden,
Ins Dunkel zu treiben und ewig zu binden
Im Lande Mordor, wo die Schatten drohn. |
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Thu Sep 18, 2008 7:32 pm Post subject: |
|
|
firefly wrote: | durch escapen der steuerzeichen
Code: | -> cat blabla.txt
abcd123
-> sed -e 's/abcd123/abcd\&1\$2\=3#\"\$\"4/g' blabla.txt
abcd&1$2=3#"$"4 |
|
Danke @ firefly, das werde ich mal testen. |
|
Back to top |
|
|
musv Advocate
Joined: 01 Dec 2002 Posts: 3337 Location: de
|
Posted: Sat Sep 20, 2008 9:22 am Post subject: |
|
|
firefly wrote: | durch escapen der steuerzeichen
Code: | -> cat blabla.txt
abcd123
-> sed -e 's/abcd123/abcd\&1\$2\=3#\"\$\"4/g' blabla.txt
abcd&1$2=3#"$"4 |
|
Das zeigt Dir die Änderung nur auf dem Bildschirm an. Willst du die Sachen gleich in der Datei ändern:
Code: | sed -e 's/abcd123/abcd\&1\$2\=3#\"\$\"4/g' -i blabla.txt |
|
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Sat Sep 20, 2008 9:44 am Post subject: |
|
|
musv wrote: | firefly wrote: | durch escapen der steuerzeichen
Code: | -> cat blabla.txt
abcd123
-> sed -e 's/abcd123/abcd\&1\$2\=3#\"\$\"4/g' blabla.txt
abcd&1$2=3#"$"4 |
|
Das zeigt Dir die Änderung nur auf dem Bildschirm an. Willst du die Sachen gleich in der Datei ändern:
Code: | sed -e 's/abcd123/abcd\&1\$2\=3#\"\$\"4/g' -i blabla.txt |
|
Das hatte noch gefehlt, Danke auch Dir musv. |
|
Back to top |
|
|
think4urs11 Bodhisattva
Joined: 25 Jun 2003 Posts: 6659 Location: above the cloud
|
Posted: Sat Sep 20, 2008 1:25 pm Post subject: |
|
|
musv wrote: | Das zeigt Dir die Änderung nur auf dem Bildschirm an. Willst du die Sachen gleich in der Datei ändern:
Code: | sed -e 's/abcd123/abcd\&1\$2\=3#\"\$\"4/g' -i blabla.txt |
|
und um es vollständig zu machen kann man auch noch automatisch ein Backup mit anlegen: Code: | sed -e -i.bak 's/abcd123/abcd\&1\$2\=3#\"\$\"4/g' blabla.txt | erstellt automatisch als Backup blabla.txt.bak
obige 5 Beiträge hier angehangen _________________ Nothing is secure / Security is always a trade-off with usability / Do not assume anything / Trust no-one, nothing / Paranoia is your friend / Think for yourself |
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Sat Sep 20, 2008 3:01 pm Post subject: |
|
|
Think4UrS11 wrote: | musv wrote: | Das zeigt Dir die Änderung nur auf dem Bildschirm an. Willst du die Sachen gleich in der Datei ändern:
Code: | sed -e 's/abcd123/abcd\&1\$2\=3#\"\$\"4/g' -i blabla.txt |
|
und um es vollständig zu machen kann man auch noch automatisch ein Backup mit anlegen: Code: | sed -e -i.bak 's/abcd123/abcd\&1\$2\=3#\"\$\"4/g' blabla.txt | erstellt automatisch als Backup blabla.txt.bak
obige 5 Beiträge hier angehangen |
Das ist ja noch besser...
Perfekt wäre es, wenn ich den roten Teil aus einer extra Datei herausholen könnte.
Quote: | sed -e -i.bak 's/abcd123/abcd\&1\$2\=3#\"\$\"4/g' blabla.txt |
Als z.B. aus einer blabla_2.txt mit dem Inhalt: abcd&1$2=3#"$"4
Das hätte dann den Vorteil, dass man dieses dann im Klartext schreiben könnte, ohne aufpassen zu müssen, das man sich beim "escapen" nicht vertippt. |
|
Back to top |
|
|
think4urs11 Bodhisattva
Joined: 25 Jun 2003 Posts: 6659 Location: above the cloud
|
Posted: Sat Sep 20, 2008 6:50 pm Post subject: |
|
|
3PO wrote: | Perfekt wäre es, wenn ich den roten Teil aus einer extra Datei herausholen könnte. Quote: | sed -e -i.bak 's/abcd123/abcd\&1\$2\=3#\"\$\"4/g' blabla.txt |
Als z.B. aus einer blabla_2.txt mit dem Inhalt: abcd&1$2=3#"$"4Das hätte dann den Vorteil, dass man dieses dann im Klartext schreiben könnte, ohne aufpassen zu müssen, das man sich beim "escapen" nicht vertippt. |
Naja das geht schon, in etwa so
Code: | encoded=$(cat blabla_2.txt | sed 's/\([&"$]\)/\\\1/g')
sed -e -i.bak 's/abcd123/$encoded/g' blabla.txt |
_________________ Nothing is secure / Security is always a trade-off with usability / Do not assume anything / Trust no-one, nothing / Paranoia is your friend / Think for yourself |
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Sat Sep 20, 2008 7:05 pm Post subject: |
|
|
Jetzt ist es perfekt, thx @ Think4UrS11. |
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Thu Oct 02, 2008 12:04 pm Post subject: |
|
|
Wie kann ich mit sed in einer Datei alle Zeilen löschen, die mit einem Leerzeichen beginnen?
Leider funktioniert das nicht:
Code: | sed -i meine_datei.txt -e "/^ \.*/d" |
|
|
Back to top |
|
|
Knieper l33t
Joined: 10 Nov 2005 Posts: 846
|
Posted: Fri Oct 03, 2008 10:12 am Post subject: |
|
|
Meinst Du mit genau einem Leerzeichen? Und welcher Fall funktioniert nicht? Gib mal ein Beispiel. _________________ Je dümmer desto Gnome/KDE. |
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Fri Oct 03, 2008 10:24 am Post subject: |
|
|
Knieper wrote: | Meinst Du mit genau einem Leerzeichen? Und welcher Fall funktioniert nicht? Gib mal ein Beispiel. |
Nun, ich möche in mit sed, oder von mir aus auch mit einen anderen Tool, in eriner Datei alle Zeilen entfernen, die Mit einem Leerzeichen <space> oder evtl. auch mit einen Tabulator <Tab> beginnen.
Code: | a a a a a a a
bbbbbbbbb
c ccc
ddd d
eeeee
ffffff
gg |
In obigen Beispiel müssten dann die Zeilen "b" und "f" gelöscht werden und das Ergebnis so aussehen:
Code: | a a a a a a a
c ccc
ddd d
eeeee
gg |
Last edited by 3PO on Fri Oct 03, 2008 12:03 pm; edited 1 time in total |
|
Back to top |
|
|
Knieper l33t
Joined: 10 Nov 2005 Posts: 846
|
Posted: Fri Oct 03, 2008 11:59 am Post subject: |
|
|
Klappt doch prima? _________________ Je dümmer desto Gnome/KDE. |
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Fri Oct 03, 2008 12:17 pm Post subject: |
|
|
Knieper wrote: | Klappt doch prima? |
Stimmt...,
Ich habe gerade bemerkt, dass das was jetzt noch vorhanden ist überflüssige Zeilenvorschübe sind.
Wie kekomme ich denn die weg?
Also, das rot geschiebene müsste noch weg:
Quote: | aaaaa<enter>
<enter>
<enter>
bbbbbbbb<enter>
<enter>
cccc<enter> |
|
|
Back to top |
|
|
Finswimmer Bodhisattva
Joined: 02 Sep 2004 Posts: 5467 Location: Langen (Hessen), Germany
|
Posted: Fri Oct 03, 2008 12:29 pm Post subject: |
|
|
sed '/^$/d
Das ist ein Kommando, welches die letzten beiden Wünsche zusammenfasst:
sed '/^[ ]*$/d'
Tobi _________________ Bitte auf Rechtschreibung, korrekte Formatierung und Höflichkeit achten!
Danke |
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Fri Oct 03, 2008 12:39 pm Post subject: |
|
|
Finswimmer wrote: | sed '/^$/d
Das ist ein Kommando, welches die letzten beiden Wünsche zusammenfasst:
sed '/^[ ]*$/d'
Tobi |
1000 Dank @ Finswimmer,
Genau das hatte ich gesuchtt. |
|
Back to top |
|
|
slick Bodhisattva
Joined: 20 Apr 2003 Posts: 3495
|
Posted: Sun Oct 05, 2008 2:09 pm Post subject: |
|
|
So ihr sed-freaks ... habe was für euch.
Ich möchte in Header einer Mail das erste Auftreten eines bestimmten Musters ersetzen.
Also Beispielswäre wäre die Mail:
Code: | X-Header-1: foo
X-Header-2: bar
From: Test
To: User
body |
Ich möchte nun das erste Vorkommen von "X-" im Header ersetzen durch "Y-" Ziel wäre dann
Code: | Y-Header-1: foo
X-Header-2: bar
From: Test
To: User
body |
Also, wie stell ichs an? |
|
Back to top |
|
|
firefly Watchman
Joined: 31 Oct 2002 Posts: 5182
|
Posted: Sun Oct 05, 2008 3:33 pm Post subject: |
|
|
indem du nach dem letzten "/" im sed befehl eine "1" anstelle von "g" angibst.
Code: | sed -e 's/X\-Header\-2/Y\-Header\-2/1' |
_________________ Ein Ring, sie zu knechten, sie alle zu finden,
Ins Dunkel zu treiben und ewig zu binden
Im Lande Mordor, wo die Schatten drohn. |
|
Back to top |
|
|
Finswimmer Bodhisattva
Joined: 02 Sep 2004 Posts: 5467 Location: Langen (Hessen), Germany
|
Posted: Sun Oct 05, 2008 3:35 pm Post subject: |
|
|
firefly wrote: | indem du nach dem letzten "/" im sed befehl eine "1" anstelle von "g" angibst.
Code: | sed -e 's/X\-Header\-2/Y\-Header\-2/1' |
|
Warum geht das bei mir nicht? Die Idee hatte ich schon vor 20 min, aber da es nicht ging, wollte ich es nicht posten.
Code: | $sed -e 's#X#Y#1' mail
Y-Header-1: foo
Y-Header-2: bar
Y-Header-2: bar
Y-Header-2: bar
Y-Header-2: bar
From: Test
To: User
bod
|
_________________ Bitte auf Rechtschreibung, korrekte Formatierung und Höflichkeit achten!
Danke |
|
Back to top |
|
|
firefly Watchman
Joined: 31 Oct 2002 Posts: 5182
|
Posted: Sun Oct 05, 2008 3:40 pm Post subject: |
|
|
wiso hast du "#" im ausdruck?
Code: | -> cat tt
X-Header-1: foo
X-Header-2: bar
From: Test
To: User
body
-> sed -e 's/X\-Header\-2/Y\-Header\-2/1' < tt
X-Header-1: foo
Y-Header-2: bar
From: Test
To: User
body |
EDIT: ok passt bei mir auch net scheinbar gilt das "1" nur für eine zeile _________________ Ein Ring, sie zu knechten, sie alle zu finden,
Ins Dunkel zu treiben und ewig zu binden
Im Lande Mordor, wo die Schatten drohn.
Last edited by firefly on Sun Oct 05, 2008 3:43 pm; edited 1 time in total |
|
Back to top |
|
|
slick Bodhisattva
Joined: 20 Apr 2003 Posts: 3495
|
Posted: Sun Oct 05, 2008 3:41 pm Post subject: |
|
|
Was ist mit dem Fall dass der "X-Header" im Header nicht vorkommt, sondern nur im Body, der aber nicht angefaßt werden soll? Man müßte die Suche bis zu den ersten \n\n einschränken. |
|
Back to top |
|
|
firefly Watchman
Joined: 31 Oct 2002 Posts: 5182
|
Posted: Sun Oct 05, 2008 3:59 pm Post subject: |
|
|
Jupp das problem ist, das sed default nur eine zeile in seinen buffer schreibt und dann auf diesen die Ersetzung durchführt.
Man kann sed sagen, das er die ganze Datei erst in seinen buffer laden soll, das hat aber den nachteil, dass das nur mit kleinen Dateien funktioniert.
Eine andere Möglichkeit ist, das sed nach dem 1. finden des gesuchten Ausdrucks die restliche Datei in einer art endlosschleife nur ausgeben soll.
Code: | sed -e '/X\-Header\-2/{;s/X\-Header\-2/Y\-Header\-2/;:a' '-en;ba' '-e}' |
Das ganze habe ich hier gefunden: http://www.unix.com/shell-programming-scripting/26562-sed-command-substitue-first-instance-2.html#post302070517
(1. treffer bei google mit folgenden suchworten: sed replace first instance) _________________ Ein Ring, sie zu knechten, sie alle zu finden,
Ins Dunkel zu treiben und ewig zu binden
Im Lande Mordor, wo die Schatten drohn. |
|
Back to top |
|
|
ichbins n00b
Joined: 25 Mar 2008 Posts: 40
|
Posted: Sun Oct 05, 2008 7:41 pm Post subject: |
|
|
und warum nicht einfach sed mit grep bzw grep mit sed kombinieren?
dann kann man doch relativ einfach das erste vorkommen in einer datei rausfinden und ändern. |
|
Back to top |
|
|
think4urs11 Bodhisattva
Joined: 25 Jun 2003 Posts: 6659 Location: above the cloud
|
Posted: Sun Oct 05, 2008 7:54 pm Post subject: |
|
|
slick wrote: | Was ist mit dem Fall dass der "X-Header" im Header nicht vorkommt, sondern nur im Body, der aber nicht angefaßt werden soll? Man müßte die Suche bis zu den ersten \n\n einschränken. |
in etwa also so oder?
Code: | sed '/^$/q;/X-Header-1/{s/X-Header-1/Y-Header-1/;:x;n;b x}' input.txt |
_________________ Nothing is secure / Security is always a trade-off with usability / Do not assume anything / Trust no-one, nothing / Paranoia is your friend / Think for yourself |
|
Back to top |
|
|
slick Bodhisattva
Joined: 20 Apr 2003 Posts: 3495
|
Posted: Sun Oct 05, 2008 8:54 pm Post subject: |
|
|
Think4UrS11 wrote: | Code: | sed '/^$/q;/X-Header-1/{s/X-Header-1/Y-Header-1/;:x;n;b x}' input.txt |
|
Danke Think4UrS11, soweit sehr gut, aber teste ich das und der X-Header-1 kommt nicht im Header vor, löscht es mir den Body weg. Man könnte einen test mit einem grep vorher machen, aber ich würde es gern am Stück pipen.
Die Variante von firefly geht hier besser, allerdings ersetzt diese auch im Body.
firefly wrote: | Code: | sed -e '/X\-Header\-2/{;s/X\-Header\-2/Y\-Header\-2/;:a' '-en;ba' '-e}' |
|
|
|
Back to top |
|
|
|