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  
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum
View previous topic :: View next topic  
Author Message
3PO
l33t
l33t


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

PostPosted: Wed Nov 17, 2010 7:40 pm    Post subject: Mal wieder suchen & ersetzen Reply with quote

Hallo zusammen,

Code:
sed 's/ABC/123/g' test.txt


ersetzt alle "ABC" durch "123" in der Datei test.txt.
Aber wie mache ich das, wenn ich "ABC" durch "123" nur in den Zeilen ersetzen will, die mit "XYZ" beginnen?
Back to top
View user's profile Send private message
Finswimmer
Moderator
Moderator


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

PostPosted: Wed Nov 17, 2010 8:40 pm    Post subject: Reply with quote

$cat 1
ABC
ABC
XYZ ABC
ABC

[21:39:45]|[tobi@tobi-desktop]|/tmp
$sed -e '/^XYZ.*/s/ABC/123/g' 1
ABC
ABC
XYZ 123
ABC
_________________
Bitte auf Rechtschreibung, korrekte Formatierung und Höflichkeit achten!
Danke
Back to top
View user's profile Send private message
3PO
l33t
l33t


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

PostPosted: Wed Nov 17, 2010 9:03 pm    Post subject: Reply with quote

THX @ Finswimmer,

Code:
sed -e '/^XYZ.*/s/ABC/123/g'  test.txt


Funktioniert soweit, nur leider habe ich dann die Ausgabe nur auf der Konsole, die "test.txt" bleibt aber unverändert. :(
Back to top
View user's profile Send private message
Max Steel
Veteran
Veteran


Joined: 12 Feb 2007
Posts: 1785
Location: My own world! I and Gentoo!

PostPosted: Wed Nov 17, 2010 9:21 pm    Post subject: Reply with quote

sed -e '/^XYZ.*/s/ABC/123/g' test.txt > test.txt
_________________
mfg
Steel
___________________
Big sorry for my bad English.

My System:
  • AMD Phenom II X4 3,2Ghz
  • 8192MB RAM
  • Gentoo AMD64 10.0
  • Kernel 3.2.6 gentoo-sources
  • NVidia Geforce GTX 550 Ti


Version 0.3c
Back to top
View user's profile Send private message
3PO
l33t
l33t


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

PostPosted: Wed Nov 17, 2010 9:30 pm    Post subject: Reply with quote

Habe es selbst gefunden. :)

So gehts:

Code:
sed -i -e '/^XYZ.*/s/ABC/123/g'  test.txt
Back to top
View user's profile Send private message
mrsteven
Veteran
Veteran


Joined: 04 Jul 2003
Posts: 1841

PostPosted: Wed Nov 17, 2010 11:07 pm    Post subject: Reply with quote

Max Steel wrote:
sed -e '/^XYZ.*/s/ABC/123/g' test.txt > test.txt


Das ist gefährlich, weil zuerst die Datei test.txt durch die Shell geöffnet und geleert wird. Erst danach öffnet sed die nun leere Datei:

Code:
stefan@mrsteven-mobil tmp $ cat << EOF > test.txt
> abcd
> efg
> hijk
> EOF
stefan@mrsteven-mobil tmp $ sed -e 's/abcd/ersetzt/' test.txt
ersetzt
efg
hijk
stefan@mrsteven-mobil tmp $ sed -e 's/abcd/ersetzt/' test.txt > test.txt
stefan@mrsteven-mobil tmp $ cat test.txt
stefan@mrsteven-mobil tmp $


...uncooles Ergebnis. Allgemein werden immer erst die Ein-/Ausgabeumleitungen ausgewertet (und damit evtl. Dateien geleert), bevor das Programm (in diesem Fall sed) selbst gestartet wird und eine Chance bekommt, an den Dateiinhalt heran zu kommen.

</klugscheiß>
_________________
Underneath it all
We feel so small
The heavens fall
But still we crawl...


ACCEPT_KEYWORDS=~arch USE=head emerge life
Back to top
View user's profile Send private message
Max Steel
Veteran
Veteran


Joined: 12 Feb 2007
Posts: 1785
Location: My own world! I and Gentoo!

PostPosted: Thu Nov 18, 2010 3:28 pm    Post subject: Reply with quote

ah okay. Danke war mir auch nicht bewusst ^^
Dann evtl besser sowass hier:
echo $(sed -e '/^XYZ.*/s/ABC/123/g' test.txt) > text.txt

oder doch lieber -i?

Edith:
HaltSTOPP!!! Ist auch Blödsinn Weil:
Code:
$ echo "ABC
> ABC
> XYZ ABC
> ABC " > test
$ echo $(sed -e '/^XYZ.*/s/ABC/123/g' test)
ABC ABC XYZ 123 ABC


Also -i.
_________________
mfg
Steel
___________________
Big sorry for my bad English.

My System:
  • AMD Phenom II X4 3,2Ghz
  • 8192MB RAM
  • Gentoo AMD64 10.0
  • Kernel 3.2.6 gentoo-sources
  • NVidia Geforce GTX 550 Ti


Version 0.3c
Back to top
View user's profile Send private message
manuels
Advocate
Advocate


Joined: 22 Nov 2003
Posts: 2129
Location: Europe

PostPosted: Wed Mar 30, 2011 7:49 pm    Post subject: Reply with quote

Willkommen zurück im "never-ending thread"!

Also, ich möchte in einem Javascript-Programm alle Property-Vorkommen der Variable db finden und durch einen Funktionsaufruf ersetzen.
Also z.B. folgende Ersetzungen:
Code:
db.foo -> db.myFunc("foo")
db.bar -> db.myFunc("bar")
db.bla -> db.myFunc("bla")
Nicht ersetzt werden, sollen Funktionsaufrufe von db, z.B.
Code:
db.someFunc()
db.anotherFunc("stringargument")
db.yetAnotherFunc({a: 3})

Ich krieg es aber schon nicht hin einen sed-Ausdruck zu Unterscheidung von Funktionen und Properties zu basteln.
Wieso klappt z.B. das hier nicht:
Code:
db\.([a-zA-Z0-9]*\w*[^\)])

Um jeden Tipp dankbar!

Manuel
_________________
Build your own live cd with catalyst 2.0!
Back to top
View user's profile Send private message
Knieper
l33t
l33t


Joined: 10 Nov 2005
Posts: 846

PostPosted: Thu Mar 31, 2011 8:36 am    Post subject: Reply with quote

manuels wrote:
en sed-Ausdruck zu Unterscheidung von Funktionen und Properties zu basteln.
Wieso klappt z.B. das hier nicht:
Code:
db\.([a-zA-Z0-9]*\w*[^\)])


Wieso sollte es? Du liest 'db.' dann eine beliebige Anzahl alphanumerischer Zeichen, gefolgt von einer beliebigen Anzahl alphanumerischer Zeichen und dann ein Zeichen, das kein ')' ist.

Die negierte Zeichenklasse am Ende funktioniert nicht, was Du meinst ist ein negativer Lookahead, den es in sed nicht gibt (dafür in PCRE, Perl, Python...). Dein Problem würde ich momentan so formulieren: lies 'db.' merke Dir die alphanumerischen Zeichen dahinter '(\w+)', wenn danach kein alphanumerisches Zeichen oder eine Klammer kommt.
Code:

>echo 'db.bar db.LaEnGER; db.foo("test") db.a' |  perl -pe 's/db\.(\w+)(?![(\w])/db.myFunc("\1")/g'
db.myFunc("bar") db.myFunc("LaEnGER"); db.foo("test") db.myFunc("a")


In sed müsstest Du Dir behelfen und alle möglichen Zeichen hinter den Variablen kennen, zB. ' ', ';' oder Zeilenende, diese erkennen und dann wieder anfügen:
Code:

echo 'db.bar db.LaEnGER; db.foo("test") db.a' | sed -r 's/db\.(\w+)([ ;\n]|$)/db.myFunc("\1")\2/g'
db.myFunc("bar") db.myFunc("LaEnGER"); db.foo("test") db.myFunc("a")

_________________
Je dümmer desto Gnome/KDE.
Back to top
View user's profile Send private message
Necoro
Veteran
Veteran


Joined: 18 Dec 2005
Posts: 1907
Location: München (Germany)

PostPosted: Thu Mar 31, 2011 8:37 am    Post subject: Reply with quote

manuels wrote:
Code:
db\.([a-zA-Z0-9]*\w*[^\)])

Also wenn du Properties matchen willst, sollte das wohl eher

Code:
db\.\([-_a-zA-Z0-9]\+\)\( |$\)


Da sed leider keine "Negative Lookaheads" unterstützt, hab ich jetzt Property als "zusammenhängenden String aus -_a-zA-Z0-9, auf den ein Leerzeichen oder ein Zeilenende folgt" definiert. Evtl sollte man auch noch das "=" oder so aufnehmen. Außerdem ist wichtig, dass sed gruppierende Klammern als "\(\)" erwartet -- "()" würde die Zeichen Klammer-Auf Klammer-Zu matchen. (Außer du nimmst das "-r" was Knieper gerade oben benutzt hat ^^)
_________________
Inter Deum Et Diabolum Semper Musica Est.
Portato - A Portage GUI
Back to top
View user's profile Send private message
3PO
l33t
l33t


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

PostPosted: Sat May 12, 2012 3:42 pm    Post subject: Reply with quote

Nochmal ne Frage zu sed...

Mit "sed 's/^/foo_/'" kann ich am Anfang von jeder Zeile ein "foo_" einfügen.

Aber wie gehe ich vor, wenn ich "foo_" am Anfang aller Zeilen einfügen will, ausser(!) bei Zeilen, die z.B. mit einem Doppelpunkt beginnen?
Back to top
View user's profile Send private message
mv
Advocate
Advocate


Joined: 20 Apr 2005
Posts: 2590

PostPosted: Sat May 12, 2012 3:50 pm    Post subject: Reply with quote

3PO wrote:
Aber wie gehe ich vor, wenn ich "foo_" am Anfang aller Zeilen einfügen will, ausser(!) bei Zeilen, die z.B. mit einem Doppelpunkt beginnen?

Code:
sed -e '/^:/!{s/^/foo_/}'
Back to top
View user's profile Send private message
3PO
l33t
l33t


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

PostPosted: Sat May 12, 2012 4:00 pm    Post subject: Reply with quote

1000 THX @ mv. :)
Back to top
View user's profile Send private message
3PO
l33t
l33t


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

PostPosted: Sat May 12, 2012 5:57 pm    Post subject: Reply with quote

mv wrote:
3PO wrote:
Aber wie gehe ich vor, wenn ich "foo_" am Anfang aller Zeilen einfügen will, ausser(!) bei Zeilen, die z.B. mit einem Doppelpunkt beginnen?

Code:
sed -e '/^:/!{s/^/foo_/}'


Nur der Vollständigkeit halber.
Wie wäre denn der sed Befehl, wenn ich "foo_" wieder entfernen wollte?

So?
Code:
 sed 's/foo_ *//'
Back to top
View user's profile Send private message
Knieper
l33t
l33t


Joined: 10 Nov 2005
Posts: 846

PostPosted: Mon May 14, 2012 6:46 am    Post subject: Reply with quote

Code:
's/^foo_//'

_________________
Je dümmer desto Gnome/KDE.
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
Page 6 of 6

 
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