Forums

Skip to content

Advanced search
  • Quick links
    • Unanswered topics
    • Active topics
    • Search
  • FAQ
  • Login
  • Register
  • Board index International Gentoo Users Deutsches Forum (German) Diskussionsforum
  • Search

sed-Wissen aus der Praxis für Noobs und Geeks

Unterhaltung über Gentoo und andere Themen: Alles was nicht in ein Support-Forum gehört.
Post Reply
  • Print view
Advanced search
162 posts
  • Page 4 of 7
    • Jump to page:
  • Previous
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • Next
Author
Message
3PO
Veteran
Veteran
User avatar
Posts: 1110
Joined: Sun Nov 26, 2006 11:38 am
Location: Schwabenländle

Suchen und ersetzen in Dateien?

  • Quote

Post by 3PO » Thu Sep 18, 2008 6:27 pm

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.
Top
firefly
Watchman
Watchman
Posts: 5385
Joined: Thu Oct 31, 2002 8:24 pm

  • Quote

Post by firefly » Thu Sep 18, 2008 7:20 pm

durch escapen der steuerzeichen :)

Code: Select all

-> 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.
Top
3PO
Veteran
Veteran
User avatar
Posts: 1110
Joined: Sun Nov 26, 2006 11:38 am
Location: Schwabenländle

  • Quote

Post by 3PO » Thu Sep 18, 2008 7:32 pm

firefly wrote:durch escapen der steuerzeichen :)

Code: Select all

-> 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.
Top
musv
Advocate
Advocate
User avatar
Posts: 3380
Joined: Sun Dec 01, 2002 4:13 pm
Location: de

  • Quote

Post by musv » Sat Sep 20, 2008 9:22 am

firefly wrote:durch escapen der steuerzeichen :)

Code: Select all

-> 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: Select all

sed -e 's/abcd123/abcd\&1\$2\=3#"\$"4/g' -i blabla.txt
Top
3PO
Veteran
Veteran
User avatar
Posts: 1110
Joined: Sun Nov 26, 2006 11:38 am
Location: Schwabenländle

  • Quote

Post by 3PO » Sat Sep 20, 2008 9:44 am

musv wrote:
firefly wrote:durch escapen der steuerzeichen :)

Code: Select all

-> 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: Select all

sed -e 's/abcd123/abcd\&1\$2\=3#"\$"4/g' -i blabla.txt
Das hatte noch gefehlt, Danke auch Dir musv. :wink:
Top
think4urs11
Bodhisattva
Bodhisattva
User avatar
Posts: 6659
Joined: Wed Jun 25, 2003 9:51 pm
Location: above the cloud

  • Quote

Post by think4urs11 » Sat Sep 20, 2008 1:25 pm

musv wrote:Das zeigt Dir die Änderung nur auf dem Bildschirm an. Willst du die Sachen gleich in der Datei ändern:

Code: Select all

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: Select all

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
Top
3PO
Veteran
Veteran
User avatar
Posts: 1110
Joined: Sun Nov 26, 2006 11:38 am
Location: Schwabenländle

  • Quote

Post by 3PO » Sat Sep 20, 2008 3:01 pm

Think4UrS11 wrote:
musv wrote:Das zeigt Dir die Änderung nur auf dem Bildschirm an. Willst du die Sachen gleich in der Datei ändern:

Code: Select all

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: Select all

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.
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:
Top
think4urs11
Bodhisattva
Bodhisattva
User avatar
Posts: 6659
Joined: Wed Jun 25, 2003 9:51 pm
Location: above the cloud

  • Quote

Post by think4urs11 » Sat Sep 20, 2008 6:50 pm

3PO wrote:Perfekt wäre es, wenn ich den roten Teil aus einer extra Datei herausholen könnte.
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: Select all

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
Top
3PO
Veteran
Veteran
User avatar
Posts: 1110
Joined: Sun Nov 26, 2006 11:38 am
Location: Schwabenländle

  • Quote

Post by 3PO » Sat Sep 20, 2008 7:05 pm

Jetzt ist es perfekt, thx @ Think4UrS11. :D
Top
3PO
Veteran
Veteran
User avatar
Posts: 1110
Joined: Sun Nov 26, 2006 11:38 am
Location: Schwabenländle

  • Quote

Post by 3PO » Thu Oct 02, 2008 12:04 pm

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

Leider funktioniert das nicht: :cry:

Code: Select all

sed -i meine_datei.txt -e "/^ \.*/d"
Top
Knieper
l33t
l33t
Posts: 846
Joined: Thu Nov 10, 2005 12:14 pm

  • Quote

Post by Knieper » Fri Oct 03, 2008 10:12 am

Meinst Du mit genau einem Leerzeichen? Und welcher Fall funktioniert nicht? Gib mal ein Beispiel.
Je dümmer desto Gnome/KDE.
Top
3PO
Veteran
Veteran
User avatar
Posts: 1110
Joined: Sun Nov 26, 2006 11:38 am
Location: Schwabenländle

  • Quote

Post by 3PO » Fri Oct 03, 2008 10:24 am

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: Select all

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: Select all

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.
Top
Knieper
l33t
l33t
Posts: 846
Joined: Thu Nov 10, 2005 12:14 pm

  • Quote

Post by Knieper » Fri Oct 03, 2008 11:59 am

Klappt doch prima?
Je dümmer desto Gnome/KDE.
Top
3PO
Veteran
Veteran
User avatar
Posts: 1110
Joined: Sun Nov 26, 2006 11:38 am
Location: Schwabenländle

  • Quote

Post by 3PO » Fri Oct 03, 2008 12:17 pm

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:
aaaaa<enter>
<enter>
<enter>
bbbbbbbb<enter>
<enter>
cccc<enter>
Top
Finswimmer
Bodhisattva
Bodhisattva
User avatar
Posts: 5467
Joined: Thu Sep 02, 2004 3:46 pm
Location: Langen (Hessen), Germany

  • Quote

Post by Finswimmer » Fri Oct 03, 2008 12:29 pm

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
Top
3PO
Veteran
Veteran
User avatar
Posts: 1110
Joined: Sun Nov 26, 2006 11:38 am
Location: Schwabenländle

  • Quote

Post by 3PO » Fri Oct 03, 2008 12:39 pm

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.
Top
slick
Bodhisattva
Bodhisattva
User avatar
Posts: 3495
Joined: Sun Apr 20, 2003 11:44 am

  • Quote

Post by slick » Sun Oct 05, 2008 2:09 pm

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: Select all

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: Select all

Y-Header-1: foo
X-Header-2: bar
From: Test
To: User

body
Also, wie stell ichs an?
Top
firefly
Watchman
Watchman
Posts: 5385
Joined: Thu Oct 31, 2002 8:24 pm

  • Quote

Post by firefly » Sun Oct 05, 2008 3:33 pm

indem du nach dem letzten "/" im sed befehl eine "1" anstelle von "g" angibst.

Code: Select all

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.
Top
Finswimmer
Bodhisattva
Bodhisattva
User avatar
Posts: 5467
Joined: Thu Sep 02, 2004 3:46 pm
Location: Langen (Hessen), Germany

  • Quote

Post by Finswimmer » Sun Oct 05, 2008 3:35 pm

firefly wrote:indem du nach dem letzten "/" im sed befehl eine "1" anstelle von "g" angibst.

Code: Select all

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: Select all

$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
Top
firefly
Watchman
Watchman
Posts: 5385
Joined: Thu Oct 31, 2002 8:24 pm

  • Quote

Post by firefly » Sun Oct 05, 2008 3:40 pm

wiso hast du "#" im ausdruck?

Code: Select all

-> 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
Last edited by firefly on Sun Oct 05, 2008 3:43 pm, edited 1 time in total.
Ein Ring, sie zu knechten, sie alle zu finden,
Ins Dunkel zu treiben und ewig zu binden
Im Lande Mordor, wo die Schatten drohn.
Top
slick
Bodhisattva
Bodhisattva
User avatar
Posts: 3495
Joined: Sun Apr 20, 2003 11:44 am

  • Quote

Post by slick » Sun Oct 05, 2008 3:41 pm

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.
Top
firefly
Watchman
Watchman
Posts: 5385
Joined: Thu Oct 31, 2002 8:24 pm

  • Quote

Post by firefly » Sun Oct 05, 2008 3:59 pm

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: Select all

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-s ... t302070517
(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.
Top
ichbins
n00b
n00b
Posts: 40
Joined: Tue Mar 25, 2008 12:04 pm

  • Quote

Post by ichbins » Sun Oct 05, 2008 7:41 pm

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.
Top
think4urs11
Bodhisattva
Bodhisattva
User avatar
Posts: 6659
Joined: Wed Jun 25, 2003 9:51 pm
Location: above the cloud

  • Quote

Post by think4urs11 » Sun Oct 05, 2008 7:54 pm

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: Select all

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
Top
slick
Bodhisattva
Bodhisattva
User avatar
Posts: 3495
Joined: Sun Apr 20, 2003 11:44 am

  • Quote

Post by slick » Sun Oct 05, 2008 8:54 pm

Think4UrS11 wrote:

Code: Select all

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: Select all

sed -e '/X\-Header\-2/{;s/X\-Header\-2/Y\-Header\-2/;:a' '-en;ba' '-e}'
Top
Post Reply
  • Print view

162 posts
  • Page 4 of 7
    • Jump to page:
  • Previous
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • Next

Return to “Diskussionsforum”

Jump to
  • Assistance
  • ↳   News & Announcements
  • ↳   Frequently Asked Questions
  • ↳   Installing Gentoo
  • ↳   Multimedia
  • ↳   Desktop Environments
  • ↳   Networking & Security
  • ↳   Kernel & Hardware
  • ↳   Portage & Programming
  • ↳   Gamers & Players
  • ↳   Other Things Gentoo
  • ↳   Unsupported Software
  • Discussion & Documentation
  • ↳   Documentation, Tips & Tricks
  • ↳   Gentoo Chat
  • ↳   Gentoo Forums Feedback
  • ↳   Duplicate Threads
  • International Gentoo Users
  • ↳   中文 (Chinese)
  • ↳   Dutch
  • ↳   Finnish
  • ↳   French
  • ↳   Deutsches Forum (German)
  • ↳   Diskussionsforum
  • ↳   Deutsche Dokumentation
  • ↳   Greek
  • ↳   Forum italiano (Italian)
  • ↳   Forum di discussione italiano
  • ↳   Risorse italiane (documentazione e tools)
  • ↳   Polskie forum (Polish)
  • ↳   Instalacja i sprzęt
  • ↳   Polish OTW
  • ↳   Portuguese
  • ↳   Documentação, Ferramentas e Dicas
  • ↳   Russian
  • ↳   Scandinavian
  • ↳   Spanish
  • ↳   Other Languages
  • Architectures & Platforms
  • ↳   Gentoo on ARM
  • ↳   Gentoo on PPC
  • ↳   Gentoo on Sparc
  • ↳   Gentoo on Alternative Architectures
  • ↳   Gentoo on AMD64
  • ↳   Gentoo for Mac OS X (Portage for Mac OS X)
  • Board index
  • All times are UTC
  • Delete cookies

© 2001–2026 Gentoo Foundation, Inc.

Powered by phpBB® Forum Software © phpBB Limited

Privacy Policy

 

 

magic