| View previous topic :: View next topic |
| Author |
Message |
3PO l33t


Joined: 26 Nov 2006 Posts: 794 Location: Schwabenländle
|
Posted: Wed Nov 17, 2010 7:40 pm Post subject: Mal wieder suchen & ersetzen |
|
|
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 |
|
 |
Finswimmer Moderator


Joined: 02 Sep 2004 Posts: 5188 Location: Langen (Hessen), Germany
|
Posted: Wed Nov 17, 2010 8:40 pm Post subject: |
|
|
$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 |
|
 |
3PO l33t


Joined: 26 Nov 2006 Posts: 794 Location: Schwabenländle
|
Posted: Wed Nov 17, 2010 9:03 pm Post subject: |
|
|
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 |
|
 |
Max Steel Veteran


Joined: 12 Feb 2007 Posts: 1785 Location: My own world! I and Gentoo!
|
Posted: Wed Nov 17, 2010 9:21 pm Post subject: |
|
|
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 |
|
 |
3PO l33t


Joined: 26 Nov 2006 Posts: 794 Location: Schwabenländle
|
Posted: Wed Nov 17, 2010 9:30 pm Post subject: |
|
|
Habe es selbst gefunden.
So gehts:
| Code: | | sed -i -e '/^XYZ.*/s/ABC/123/g' test.txt |
|
|
| Back to top |
|
 |
mrsteven Veteran


Joined: 04 Jul 2003 Posts: 1841
|
Posted: Wed Nov 17, 2010 11:07 pm Post subject: |
|
|
| 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 |
|
 |
Max Steel Veteran


Joined: 12 Feb 2007 Posts: 1785 Location: My own world! I and Gentoo!
|
Posted: Thu Nov 18, 2010 3:28 pm Post subject: |
|
|
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 |
|
 |
manuels Advocate


Joined: 22 Nov 2003 Posts: 2129 Location: Europe
|
Posted: Wed Mar 30, 2011 7:49 pm Post subject: |
|
|
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 |
|
 |
Knieper l33t

Joined: 10 Nov 2005 Posts: 846
|
Posted: Thu Mar 31, 2011 8:36 am Post subject: |
|
|
| 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 |
|
 |
Necoro Veteran


Joined: 18 Dec 2005 Posts: 1907 Location: München (Germany)
|
Posted: Thu Mar 31, 2011 8:37 am Post subject: |
|
|
| 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 |
|
 |
3PO l33t


Joined: 26 Nov 2006 Posts: 794 Location: Schwabenländle
|
Posted: Sat May 12, 2012 3:42 pm Post subject: |
|
|
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 |
|
 |
mv Advocate


Joined: 20 Apr 2005 Posts: 2590
|
Posted: Sat May 12, 2012 3:50 pm Post subject: |
|
|
| 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 |
|
 |
3PO l33t


Joined: 26 Nov 2006 Posts: 794 Location: Schwabenländle
|
Posted: Sat May 12, 2012 4:00 pm Post subject: |
|
|
1000 THX @ mv.  |
|
| Back to top |
|
 |
3PO l33t


Joined: 26 Nov 2006 Posts: 794 Location: Schwabenländle
|
Posted: Sat May 12, 2012 5:57 pm Post subject: |
|
|
| 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?
|
|
| Back to top |
|
 |
Knieper l33t

Joined: 10 Nov 2005 Posts: 846
|
Posted: Mon May 14, 2012 6:46 am Post subject: |
|
|
_________________ Je dümmer desto Gnome/KDE. |
|
| Back to top |
|
 |
|