Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
sed-Wissen aus der Praxis für Noobs und Geeks
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

Goto page Previous  1, 2, 3, 4, 5, 6, 7  Next  
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum
View previous topic :: View next topic  
Author Message
3PO
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1110
Location: Schwabenländle

PostPosted: Thu Sep 18, 2008 6:27 pm    Post subject: Suchen und ersetzen in Dateien? Reply with quote

Hallo Zusammen,

ich habe mal wieder ein Problem. :lol:

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. :cry:

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
View user's profile Send private message
firefly
Watchman
Watchman


Joined: 31 Oct 2002
Posts: 5165

PostPosted: Thu Sep 18, 2008 7:20 pm    Post subject: Reply with quote

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
View user's profile Send private message
3PO
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1110
Location: Schwabenländle

PostPosted: Thu Sep 18, 2008 7:32 pm    Post subject: Reply with quote

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
View user's profile Send private message
musv
Advocate
Advocate


Joined: 01 Dec 2002
Posts: 3333
Location: de

PostPosted: Sat Sep 20, 2008 9:22 am    Post subject: Reply with quote

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
View user's profile Send private message
3PO
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1110
Location: Schwabenländle

PostPosted: Sat Sep 20, 2008 9:44 am    Post subject: Reply with quote

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. :wink:
Back to top
View user's profile Send private message
think4urs11
Bodhisattva
Bodhisattva


Joined: 25 Jun 2003
Posts: 6659
Location: above the cloud

PostPosted: Sat Sep 20, 2008 1:25 pm    Post subject: Reply with quote

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
View user's profile Send private message
3PO
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1110
Location: Schwabenländle

PostPosted: Sat Sep 20, 2008 3:01 pm    Post subject: Reply with quote

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... :D

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. :wink:
Back to top
View user's profile Send private message
think4urs11
Bodhisattva
Bodhisattva


Joined: 25 Jun 2003
Posts: 6659
Location: above the cloud

PostPosted: Sat Sep 20, 2008 6:50 pm    Post subject: Reply with quote

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. :wink:

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
View user's profile Send private message
3PO
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1110
Location: Schwabenländle

PostPosted: Sat Sep 20, 2008 7:05 pm    Post subject: Reply with quote

Jetzt ist es perfekt, thx @ Think4UrS11. :D
Back to top
View user's profile Send private message
3PO
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1110
Location: Schwabenländle

PostPosted: Thu Oct 02, 2008 12:04 pm    Post subject: Reply with quote

Wie kann ich mit sed in einer Datei alle Zeilen löschen, die mit einem Leerzeichen beginnen?

Leider funktioniert das nicht: :cry:

Code:
sed -i meine_datei.txt -e "/^ \.*/d"
Back to top
View user's profile Send private message
Knieper
l33t
l33t


Joined: 10 Nov 2005
Posts: 846

PostPosted: Fri Oct 03, 2008 10:12 am    Post subject: Reply with quote

Meinst Du mit genau einem Leerzeichen? Und welcher Fall funktioniert nicht? Gib mal ein Beispiel.
_________________
Je dümmer desto Gnome/KDE.
Back to top
View user's profile Send private message
3PO
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1110
Location: Schwabenländle

PostPosted: Fri Oct 03, 2008 10:24 am    Post subject: Reply with quote

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
View user's profile Send private message
Knieper
l33t
l33t


Joined: 10 Nov 2005
Posts: 846

PostPosted: Fri Oct 03, 2008 11:59 am    Post subject: Reply with quote

Klappt doch prima?
_________________
Je dümmer desto Gnome/KDE.
Back to top
View user's profile Send private message
3PO
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1110
Location: Schwabenländle

PostPosted: Fri Oct 03, 2008 12:17 pm    Post subject: Reply with quote

Knieper wrote:
Klappt doch prima?


Stimmt..., :oops: :oops:

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
View user's profile Send private message
Finswimmer
Bodhisattva
Bodhisattva


Joined: 02 Sep 2004
Posts: 5467
Location: Langen (Hessen), Germany

PostPosted: Fri Oct 03, 2008 12:29 pm    Post subject: Reply with quote

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
View user's profile Send private message
3PO
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1110
Location: Schwabenländle

PostPosted: Fri Oct 03, 2008 12:39 pm    Post subject: Reply with quote

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
View user's profile Send private message
slick
Bodhisattva
Bodhisattva


Joined: 20 Apr 2003
Posts: 3495

PostPosted: Sun Oct 05, 2008 2:09 pm    Post subject: Reply with quote

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
View user's profile Send private message
firefly
Watchman
Watchman


Joined: 31 Oct 2002
Posts: 5165

PostPosted: Sun Oct 05, 2008 3:33 pm    Post subject: Reply with quote

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
View user's profile Send private message
Finswimmer
Bodhisattva
Bodhisattva


Joined: 02 Sep 2004
Posts: 5467
Location: Langen (Hessen), Germany

PostPosted: Sun Oct 05, 2008 3:35 pm    Post subject: Reply with quote

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
View user's profile Send private message
firefly
Watchman
Watchman


Joined: 31 Oct 2002
Posts: 5165

PostPosted: Sun Oct 05, 2008 3:40 pm    Post subject: Reply with quote

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
View user's profile Send private message
slick
Bodhisattva
Bodhisattva


Joined: 20 Apr 2003
Posts: 3495

PostPosted: Sun Oct 05, 2008 3:41 pm    Post subject: Reply with quote

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
View user's profile Send private message
firefly
Watchman
Watchman


Joined: 31 Oct 2002
Posts: 5165

PostPosted: Sun Oct 05, 2008 3:59 pm    Post subject: Reply with quote

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
View user's profile Send private message
ichbins
n00b
n00b


Joined: 25 Mar 2008
Posts: 40

PostPosted: Sun Oct 05, 2008 7:41 pm    Post subject: Reply with quote

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
View user's profile Send private message
think4urs11
Bodhisattva
Bodhisattva


Joined: 25 Jun 2003
Posts: 6659
Location: above the cloud

PostPosted: Sun Oct 05, 2008 7:54 pm    Post subject: Reply with quote

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
View user's profile Send private message
slick
Bodhisattva
Bodhisattva


Joined: 20 Apr 2003
Posts: 3495

PostPosted: Sun Oct 05, 2008 8:54 pm    Post subject: Reply with quote

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
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum All times are GMT
Goto page Previous  1, 2, 3, 4, 5, 6, 7  Next
Page 4 of 7

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum