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: 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
Bodhisattva
Bodhisattva


Joined: 02 Sep 2004
Posts: 5467
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
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1110
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
Advocate
Advocate


Joined: 12 Feb 2007
Posts: 2229
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
___________________

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


Joined: 26 Nov 2006
Posts: 1110
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: 1938

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ß>
_________________
Unix philosophy: "Do one thing and do it well."
systemd: "Do everything and do it wrong."
Back to top
View user's profile Send private message
Max Steel
Advocate
Advocate


Joined: 12 Feb 2007
Posts: 2229
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
___________________

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


Joined: 22 Nov 2003
Posts: 2146
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: 1912
Location: 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.
Back to top
View user's profile Send private message
3PO
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1110
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
Watchman
Watchman


Joined: 20 Apr 2005
Posts: 6747

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
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1110
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
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1110
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
Max Steel
Advocate
Advocate


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

PostPosted: Thu May 31, 2012 12:14 am    Post subject: Reply with quote

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


Joined: 31 Oct 2002
Posts: 5161

PostPosted: Thu May 31, 2012 6:27 am    Post subject: Reply with quote

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


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

PostPosted: Thu May 31, 2012 10:25 am    Post subject: Reply with quote

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


Joined: 31 Oct 2002
Posts: 5161

PostPosted: Thu May 31, 2012 1:13 pm    Post subject: Reply with quote

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


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

PostPosted: Thu May 31, 2012 2:25 pm    Post subject: Reply with quote

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


Joined: 20 Apr 2003
Posts: 3495

PostPosted: Wed Aug 29, 2012 7:31 am    Post subject: Reply with quote

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


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

PostPosted: Tue Nov 06, 2012 6:24 pm    Post subject: Reply with quote

Hallo Zusammen,

ich stehe mal wieder auf dem Schlauch, was sed angeht....

Das,
Code:
sed -e 's/;.*$//'

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


Joined: 04 Jul 2003
Posts: 1938

PostPosted: Tue Nov 06, 2012 7:06 pm    Post subject: Reply with quote

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


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

PostPosted: Tue Nov 06, 2012 7:17 pm    Post subject: Reply with quote

Ja, das wars, 1000 THX.
Back to top
View user's profile Send private message
3PO
Veteran
Veteran


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

PostPosted: Sat May 03, 2014 8:40 am    Post subject: Reply with quote

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
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 6 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