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 6 of 7
    • Jump to page:
  • Previous
  • 1
  • …
  • 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

Mal wieder suchen & ersetzen

  • Quote

Post by 3PO » Wed Nov 17, 2010 7:40 pm

Hallo zusammen,

Code: Select all

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

  • Quote

Post by Finswimmer » Wed Nov 17, 2010 8:40 pm

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

  • Quote

Post by 3PO » Wed Nov 17, 2010 9:03 pm

THX @ Finswimmer,

Code: Select all

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. :(
Top
Max Steel
Advocate
Advocate
User avatar
Posts: 2324
Joined: Mon Feb 12, 2007 6:35 pm
Location: My own world! I and Gentoo!

  • Quote

Post by Max Steel » Wed Nov 17, 2010 9:21 pm

sed -e '/^XYZ.*/s/ABC/123/g' test.txt > test.txt
mfg
Steel
___________________

Heim-PC: AMD Ryzen 9 5950X, 64GB RAM, RX 9070 XT
Laptop: AMD Ryzen 5 7640U, 32GB RAM, Radeon onCPU Graphics
Arbeit-PC: AMD Ryzen 3 Pro 7335U, 16GB RAM, AMD Radeon Graphics (leider WSL2)
Top
3PO
Veteran
Veteran
User avatar
Posts: 1110
Joined: Sun Nov 26, 2006 11:38 am
Location: Schwabenländle

  • Quote

Post by 3PO » Wed Nov 17, 2010 9:30 pm

Habe es selbst gefunden. :)

So gehts:

Code: Select all

sed -i -e '/^XYZ.*/s/ABC/123/g'  test.txt
Top
mrsteven
Veteran
Veteran
User avatar
Posts: 1939
Joined: Fri Jul 04, 2003 3:22 pm

  • Quote

Post by mrsteven » Wed Nov 17, 2010 11:07 pm

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

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ß>
Top
Max Steel
Advocate
Advocate
User avatar
Posts: 2324
Joined: Mon Feb 12, 2007 6:35 pm
Location: My own world! I and Gentoo!

  • Quote

Post by Max Steel » Thu Nov 18, 2010 3:28 pm

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

$ 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 9 5950X, 64GB RAM, RX 9070 XT
Laptop: AMD Ryzen 5 7640U, 32GB RAM, Radeon onCPU Graphics
Arbeit-PC: AMD Ryzen 3 Pro 7335U, 16GB RAM, AMD Radeon Graphics (leider WSL2)
Top
manuels
Advocate
Advocate
User avatar
Posts: 2146
Joined: Sat Nov 22, 2003 5:50 pm
Location: Europe

  • Quote

Post by manuels » Wed Mar 30, 2011 7:49 pm

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

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

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

db\.([a-zA-Z0-9]*\w*[^\)])
Um jeden Tipp dankbar!

Manuel
Build your own live cd with catalyst 2.0!
Top
Knieper
l33t
l33t
Posts: 846
Joined: Thu Nov 10, 2005 12:14 pm

  • Quote

Post by Knieper » Thu Mar 31, 2011 8:36 am

manuels wrote:en sed-Ausdruck zu Unterscheidung von Funktionen und Properties zu basteln.
Wieso klappt z.B. das hier nicht:

Code: Select all

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

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

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.
Top
Necoro
Veteran
Veteran
User avatar
Posts: 1912
Joined: Sun Dec 18, 2005 3:57 pm
Location: Germany

  • Quote

Post by Necoro » Thu Mar 31, 2011 8:37 am

manuels wrote:

Code: Select all

db\.([a-zA-Z0-9]*\w*[^\)])
Also wenn du Properties matchen willst, sollte das wohl eher

Code: Select all

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

  • Quote

Post by 3PO » Sat May 12, 2012 3:42 pm

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?
Top
mv
Watchman
Watchman
User avatar
Posts: 6795
Joined: Wed Apr 20, 2005 12:12 pm

  • Quote

Post by mv » Sat May 12, 2012 3:50 pm

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

sed -e '/^:/!{s/^/foo_/}'
Top
3PO
Veteran
Veteran
User avatar
Posts: 1110
Joined: Sun Nov 26, 2006 11:38 am
Location: Schwabenländle

  • Quote

Post by 3PO » Sat May 12, 2012 4:00 pm

1000 THX @ mv. :)
Top
3PO
Veteran
Veteran
User avatar
Posts: 1110
Joined: Sun Nov 26, 2006 11:38 am
Location: Schwabenländle

  • Quote

Post by 3PO » Sat May 12, 2012 5:57 pm

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

sed -e '/^:/!{s/^/foo_/}'
Nur der Vollständigkeit halber.
Wie wäre denn der sed Befehl, wenn ich "foo_" wieder entfernen wollte?

So?

Code: Select all

 sed 's/foo_ *//'
Top
Knieper
l33t
l33t
Posts: 846
Joined: Thu Nov 10, 2005 12:14 pm

  • Quote

Post by Knieper » Mon May 14, 2012 6:46 am

Code: Select all

's/^foo_//'
Je dümmer desto Gnome/KDE.
Top
Max Steel
Advocate
Advocate
User avatar
Posts: 2324
Joined: Mon Feb 12, 2007 6:35 pm
Location: My own world! I and Gentoo!

  • Quote

Post by Max Steel » Thu May 31, 2012 12:14 am

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 9 5950X, 64GB RAM, RX 9070 XT
Laptop: AMD Ryzen 5 7640U, 32GB RAM, Radeon onCPU Graphics
Arbeit-PC: AMD Ryzen 3 Pro 7335U, 16GB RAM, AMD Radeon Graphics (leider WSL2)
Top
firefly
Watchman
Watchman
Posts: 5385
Joined: Thu Oct 31, 2002 8:24 pm

  • Quote

Post by firefly » Thu May 31, 2012 6:27 am

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

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.
Top
Max Steel
Advocate
Advocate
User avatar
Posts: 2324
Joined: Mon Feb 12, 2007 6:35 pm
Location: My own world! I and Gentoo!

  • Quote

Post by Max Steel » Thu May 31, 2012 10:25 am

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

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 9 5950X, 64GB RAM, RX 9070 XT
Laptop: AMD Ryzen 5 7640U, 32GB RAM, Radeon onCPU Graphics
Arbeit-PC: AMD Ryzen 3 Pro 7335U, 16GB RAM, AMD Radeon Graphics (leider WSL2)
Top
firefly
Watchman
Watchman
Posts: 5385
Joined: Thu Oct 31, 2002 8:24 pm

  • Quote

Post by firefly » Thu May 31, 2012 1:13 pm

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.
Top
Max Steel
Advocate
Advocate
User avatar
Posts: 2324
Joined: Mon Feb 12, 2007 6:35 pm
Location: My own world! I and Gentoo!

  • Quote

Post by Max Steel » Thu May 31, 2012 2:25 pm

Kann ich dann direkt wenn ich zuhause bin nachschaun (bin noch auf Arbeit)
mfg
Steel
___________________

Heim-PC: AMD Ryzen 9 5950X, 64GB RAM, RX 9070 XT
Laptop: AMD Ryzen 5 7640U, 32GB RAM, Radeon onCPU Graphics
Arbeit-PC: AMD Ryzen 3 Pro 7335U, 16GB RAM, AMD Radeon Graphics (leider WSL2)
Top
slick
Bodhisattva
Bodhisattva
User avatar
Posts: 3495
Joined: Sun Apr 20, 2003 11:44 am

  • Quote

Post by slick » Wed Aug 29, 2012 7:31 am

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

  • Quote

Post by 3PO » Tue Nov 06, 2012 6:24 pm

Hallo Zusammen,

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

Das,

Code: Select all

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.
Top
mrsteven
Veteran
Veteran
User avatar
Posts: 1939
Joined: Fri Jul 04, 2003 3:22 pm

  • Quote

Post by mrsteven » Tue Nov 06, 2012 7:06 pm

Code: Select all

sed -e 's/;.*$/.abc/'
Oder habe ich dein Problem falsch verstanden?
Top
3PO
Veteran
Veteran
User avatar
Posts: 1110
Joined: Sun Nov 26, 2006 11:38 am
Location: Schwabenländle

  • Quote

Post by 3PO » Tue Nov 06, 2012 7:17 pm

Ja, das wars, 1000 THX.
Top
3PO
Veteran
Veteran
User avatar
Posts: 1110
Joined: Sun Nov 26, 2006 11:38 am
Location: Schwabenländle

  • Quote

Post by 3PO » Sat May 03, 2014 8:40 am

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?
Top
Post Reply
  • Print view

162 posts
  • Page 6 of 7
    • Jump to page:
  • Previous
  • 1
  • …
  • 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