View previous topic :: View next topic |
Author |
Message |
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 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 Bodhisattva
Joined: 02 Sep 2004 Posts: 5467 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 Veteran
Joined: 26 Nov 2006 Posts: 1110 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 Advocate
Joined: 12 Feb 2007 Posts: 2242 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
___________________
Heim-PC: AMD Ryzen 5950X, 64GB RAM, GTX 1080
Laptop: Intel Core i5-4300U, 16GB RAM, Intel Graphic
Arbeit-PC: Intel i5-1145G7, 16GB RAM, Intel Iris Xe Graphic (leider WSL2) |
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 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: 1938
|
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ß> _________________ Unix philosophy: "Do one thing and do it well."
systemd: "Do everything and do it wrong." |
|
Back to top |
|
|
Max Steel Advocate
Joined: 12 Feb 2007 Posts: 2242 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
___________________
Heim-PC: AMD Ryzen 5950X, 64GB RAM, GTX 1080
Laptop: Intel Core i5-4300U, 16GB RAM, Intel Graphic
Arbeit-PC: Intel i5-1145G7, 16GB RAM, Intel Iris Xe Graphic (leider WSL2) |
|
Back to top |
|
|
manuels Advocate
Joined: 22 Nov 2003 Posts: 2146 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: 1912 Location: 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. |
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 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 Watchman
Joined: 20 Apr 2005 Posts: 6749
|
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 Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Sat May 12, 2012 4:00 pm Post subject: |
|
|
1000 THX @ mv. |
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 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 |
|
|
Max Steel Advocate
Joined: 12 Feb 2007 Posts: 2242 Location: My own world! I and Gentoo!
|
Posted: Thu May 31, 2012 12:14 am Post subject: |
|
|
Mal eben eine Frage, und zwar habe ich die Ausgabe von grep samt filename.
Und möchte für die Weiterverarbeitung nur die Filenamen (ob mehrmals vorhanden oder nicht) weiterverwenden.
Wie lässt sich das am einfachsten machen (alle Filenamen haben die gleiche Struktur: f[0-9]*.txt
bsp:
f21292056.txt:From: <abc@abc.de>
Ab dem Filenamen ist der zweite Teil Variabel. _________________ mfg
Steel
___________________
Heim-PC: AMD Ryzen 5950X, 64GB RAM, GTX 1080
Laptop: Intel Core i5-4300U, 16GB RAM, Intel Graphic
Arbeit-PC: Intel i5-1145G7, 16GB RAM, Intel Iris Xe Graphic (leider WSL2) |
|
Back to top |
|
|
firefly Watchman
Joined: 31 Oct 2002 Posts: 5221
|
Posted: Thu May 31, 2012 6:27 am Post subject: |
|
|
Max Steel wrote: | Mal eben eine Frage, und zwar habe ich die Ausgabe von grep samt filename.
Und möchte für die Weiterverarbeitung nur die Filenamen (ob mehrmals vorhanden oder nicht) weiterverwenden.
Wie lässt sich das am einfachsten machen (alle Filenamen haben die gleiche Struktur: f[0-9]*.txt
bsp:
f21292056.txt:From: <abc@abc.de>
Ab dem Filenamen ist der zweite Teil Variabel. |
ist der doppelpunkt nach dem dateinamen auch immer vorhanden? Wenn ja könnte man auch was mit "cut" machen.
folgendes ungetestet bin gerade nicht an einem rechner mit ner unix shell
Code: | echo "f21292056.txt:From: <abc@abc.de>" | cut -d':' -f0 |
_________________ 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 |
|
|
Max Steel Advocate
Joined: 12 Feb 2007 Posts: 2242 Location: My own world! I and Gentoo!
|
Posted: Thu May 31, 2012 10:25 am Post subject: |
|
|
firefly wrote: | ist der doppelpunkt nach dem dateinamen auch immer vorhanden? Wenn ja könnte man auch was mit "cut" machen.
folgendes ungetestet bin gerade nicht an einem rechner mit ner unix shell
Code: | echo "f21292056.txt:From: <abc@abc.de>" | cut -d':' -f0 |
|
Jupp. der Doppelpunkt ist immer vorhanden (wie schon gesagt, ein Output von grep mit dateinamen).
Super so funktioniert das (ich weiß nicht ob das am Windows-unxutils-cut liegt aber ich musste -f1 auswählen, vll einfach ein Kompatibiltätsquatsch seitens Windows.) _________________ mfg
Steel
___________________
Heim-PC: AMD Ryzen 5950X, 64GB RAM, GTX 1080
Laptop: Intel Core i5-4300U, 16GB RAM, Intel Graphic
Arbeit-PC: Intel i5-1145G7, 16GB RAM, Intel Iris Xe Graphic (leider WSL2) |
|
Back to top |
|
|
firefly Watchman
Joined: 31 Oct 2002 Posts: 5221
|
Posted: Thu May 31, 2012 1:13 pm Post subject: |
|
|
Max Steel wrote: | Super so funktioniert das (ich weiß nicht ob das am Windows-unxutils-cut liegt aber ich musste -f1 auswählen, vll einfach ein Kompatibiltätsquatsch seitens Windows.) |
Ne das mit -f1 kann schon passen, wie schon gesagt die beispielzeile hatte ich einfach aus dem kopf geschrieben, da ich aktuell keinen zugriff auf eine unix/linux shell habe. _________________ 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 |
|
|
Max Steel Advocate
Joined: 12 Feb 2007 Posts: 2242 Location: My own world! I and Gentoo!
|
Posted: Thu May 31, 2012 2:25 pm Post subject: |
|
|
Kann ich dann direkt wenn ich zuhause bin nachschaun (bin noch auf Arbeit) _________________ mfg
Steel
___________________
Heim-PC: AMD Ryzen 5950X, 64GB RAM, GTX 1080
Laptop: Intel Core i5-4300U, 16GB RAM, Intel Graphic
Arbeit-PC: Intel i5-1145G7, 16GB RAM, Intel Iris Xe Graphic (leider WSL2) |
|
Back to top |
|
|
slick Bodhisattva
Joined: 20 Apr 2003 Posts: 3495
|
Posted: Wed Aug 29, 2012 7:31 am Post subject: |
|
|
Ich bräuchte auch mal etwas Hilfe. Ich habe einen (eigentlich mehrzeiligen) Text in dem an irgendeiner Stelle eine bestimmte ID (in einem bestimmten Format) befindet. (Ein die ID umfliessender Text ist nicht zwangsläufig, der "Text" kann auch nur die ID selbst sein) Diese ID möchte ich gern extrahieren. D.h. Text rein, ID raus. Die ID besteht aus Komponenten mit fixer Länge, jedoch gibt es auch Abweichler. Eigentlich brauche ich somit zwei Code-Schnipsel. Einer der die ID exakt gemäß der fixen Längen extrahiert (und andere ignoriert) und eine weichere Version die auch IDs mit ungleich langen Komponenten findet, sofern das Muster stimmt.
Die ID setzt sich wie folgt zusammen (case-insensitiv)
YYMMDD-X-YYYYY-ZZZ
Dabei gilt:
YYMMDD - 6 stellige Datumsangabe [0-9]
X - einstelliger Buchstabe [A-Z]
YYYYY - 5 stelliger Wert [A-Z,0-9]
ZZZ - 3 stellige Zahl [0-9]
Teilweise ist die ID durch Leerzeichen vom Text getrennt, stellenweise aber auch um weitere Zeichen erweitert die ich nicht mit extrahiere möchte. z.b: Buchstaben davor oder dahinter (a, b). z.B. aYYMMDD-X-YYYYY-ZZZb.
Das waren die Angaben für die "strenge" Prüfung. Für die weichere Variante sehen die Regeln wie folgt aus:
NNNNNN-X-YYYYY-ZZZ
NNNNNN - n stelliger Zahlenwert [0-9], wobei sich die Länge durch die "umschliessenden" nicht-numerischen Zeichen ergibt
X - n stelliger Buchstabenwert [A-Z], wobei sich die Länge durch das umschliessenden Zeichen "-" ergibt
YYYYY - n stelliger Wert [A-Z,0-9], wobei sich die Länge durch das umschliessenden Zeichen "-" ergibt
ZZZ - n stellige Zahl [0-9], wobei sich die Länge durch die "umschliessenden" nicht-numerischen Zeichen ergibt
Auch hier gilt wieder, die ID könnte um anderen Zeichen ergänzt sein, die ich nicht möchte (a,b) : aNNNNNN-X-YYYYY-ZZZb. |
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Tue Nov 06, 2012 6:24 pm Post subject: |
|
|
Hallo Zusammen,
ich stehe mal wieder auf dem Schlauch, was sed angeht....
Das,
löscht ja das ";" und alles nachfolgende in der Zeile.
Wie gehe ich aber vor, wenn ich folgendes machen will:
Lösche das ";" und alles nachfolgende in der Zeile und füge dafür ".abc" ein. |
|
Back to top |
|
|
mrsteven Veteran
Joined: 04 Jul 2003 Posts: 1938
|
Posted: Tue Nov 06, 2012 7:06 pm Post subject: |
|
|
Code: | sed -e 's/;.*$/.abc/' |
Oder habe ich dein Problem falsch verstanden? _________________ Unix philosophy: "Do one thing and do it well."
systemd: "Do everything and do it wrong." |
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Tue Nov 06, 2012 7:17 pm Post subject: |
|
|
Ja, das wars, 1000 THX. |
|
Back to top |
|
|
3PO Veteran
Joined: 26 Nov 2006 Posts: 1110 Location: Schwabenländle
|
Posted: Sat May 03, 2014 8:40 am Post subject: |
|
|
Hallo Zusammen,
kann sed eigentlich auch "von hinten" rechnen?
Ich bräuchte von jeder Zeile nur das siebte und das achte Zeichen, allerdings von hinten her gerechnet.
Geht so etwas mit sed? |
|
Back to top |
|
|
|