Frage zu sed...

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
ts_berlin
Beiträge: 37
Registriert: 24.02.2003 17:48:35
Lizenz eigener Beiträge: GNU General Public License
Wohnort: Berlin
Kontaktdaten:

Frage zu sed...

Beitrag von ts_berlin » 31.05.2023 11:57:07

Hallo Zusammen,
ich arbeite mich gerade bei sed ein und habe in der Anleitung eine nützlichen Einzeiler gefunden, der eine Zeile nach Kriterien löscht und speichert und an einer anderen Stelle (hier Zeilennummer) wieder herausgeben soll

Code: Alles auswählen

sed -e '/Wasichsuche/{h;d}' -e '4g'
'Wasichsuche' soll ausgeschnitten werden und nach der vierten Zeile ausgegeben werden. Allerdings wird es ausgeschnitten und ein leere Zeile wird eingesetzt.

Code: Alles auswählen

sed -e '/Wasichsuche/{h;d}' -e '$g'
hingegen macht es richtig. 'Wasichsuche' wird ausgeschnitten und ans Ende eingefügt.

Was mache ich (und auch die Anleitungen) falsch....?

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Frage zu sed...

Beitrag von Meillo » 31.05.2023 12:05:28

Ich kann deine Beschreibung, was tatsaechlich passieren wuerde, so nicht nachvollziehen. Bei mir wird die Zeile immer eingefuegt, aber es wird damit die vorige Zeile ersetzt. (Vielleicht hattest du eine Leerzeile am Ende, so dass das nicht aufgefallen ist.)

Probiere mal ein grosses `G' statt dem kleinen `g'. Damit wird die gespeicherte Zeile an die aktuelle Zeile angehaengt, statt sie zu ersetzen. Das scheint mir eher das zu sein, was du willst.

Falls das nicht passt oder ich dich nicht richtig verstanden habe, dann poste bitte von einem Minimalbeispiel die Eingabedatei und die gewuenschte Ausgabe des Befehls.


Edit:

Hier noch meine Shellsession:

Code: Alles auswählen

:-Q cat /tmp/a
eins
zwei
drei
vier

:-Q sed -e '/zwei/{h;d}' -e '3g' /tmp/a    
eins
zwei
vier

:-Q sed -e '/zwei/{h;d}' -e '$g' /tmp/a
eins
drei
zwei

:-Q sed -e '/zwei/{h;d}' -e '3G' /tmp/a
eins
drei
zwei
vier

:-Q sed -e '/zwei/{h;d}' -e '$G' /tmp/a
eins
drei
vier
zwei
Use ed once in a while!

ts_berlin
Beiträge: 37
Registriert: 24.02.2003 17:48:35
Lizenz eigener Beiträge: GNU General Public License
Wohnort: Berlin
Kontaktdaten:

Re: Frage zu sed...

Beitrag von ts_berlin » 31.05.2023 12:09:59

Ok...
Beispieldatei:

Code: Alles auswählen

George Washington, 1789-1797
John Adams, 1797-1801
Thomas Jefferson, 1801-1809
James Madison, 1809-1817
James Monroe, 1817-1825
John Quincy Adams, 1825-1829
Andrew Jackson, 1829-1837
Martin Van Buren, 1837-1841
William Henry Harrison, 1841
John Tyler, 1841-1845
James Knox Polk, 1845-1849
Befehl:

Code: Alles auswählen

sed -e '/Knox/{h;d}' -e '4G'
Ausgabe:

Code: Alles auswählen

George Washington, 1789-1797
John Adams, 1797-1801
Thomas Jefferson, 1801-1809
James Madison, 1809-1817

James Monroe, 1817-1825
John Quincy Adams, 1825-1829
Andrew Jackson, 1829-1837
Martin Van Buren, 1837-1841
William Henry Harrison, 1841
John Tyler, 1841-1845
Aber erwartet:

Code: Alles auswählen

George Washington, 1789-1797
John Adams, 1797-1801
Thomas Jefferson, 1801-1809
James Madison, 1809-1817
James Knox Polk, 1845-1849
James Monroe, 1817-1825
John Quincy Adams, 1825-1829
Andrew Jackson, 1829-1837
Martin Van Buren, 1837-1841
William Henry Harrison, 1841
John Tyler, 1841-1845
Es gibt keine Leerzeilen im Orginaltext
Ich habe es auch online hier ausprobiert
https://sed.js.org/

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Frage zu sed...

Beitrag von Meillo » 31.05.2023 12:14:22

Achso. :-D

Sed laeuft nur einmal von oben nach unten durch die Datei. Es ist mit dem Befehl nicht moeglich, eine Zeile von weiter unten nach weiter oben zu schieben. ;-) Das mit sed umzusetzen waere vermutlich recht umstaendlich. Aber mit anderen Programmen ginge es.

Was ist denn der Hintergrund fuer den Befehl? Warum willst du das per Befehl machen und nicht manuell im Editor? Ist dieser Befehl der einzige, den du brauchst? Wie umfangreich koennen die Daten sein? -- Ich kann dir gerne was zusammenbauen, muesste aber ungefaehr wissen, um was es geht, damit die Loesung halbwegs passend ist.
Use ed once in a while!

ts_berlin
Beiträge: 37
Registriert: 24.02.2003 17:48:35
Lizenz eigener Beiträge: GNU General Public License
Wohnort: Berlin
Kontaktdaten:

Re: Frage zu sed...

Beitrag von ts_berlin » 31.05.2023 12:24:55

Hallo Meillo,
ich habe immer sed nur für Ersetzungfunktionen gebraucht, aber bin nie in die Tiefe gegangen und wollte das mit Beispielen ausprobieren. Konkret brauche ich nix, ausser die Skills.


Danke für deine Mühen

tobo
Beiträge: 1989
Registriert: 10.12.2008 10:51:41

Re: Frage zu sed...

Beitrag von tobo » 31.05.2023 12:43:51

Wenn es nur darum geht, die letzte Zeile zur 5. Zeile zu machen, dann könnte man sowas machen:

Code: Alles auswählen

ex - FILE <<<'m4|%p'
Alternativ speichern mit w, anstatt alles ausgeben mit %p.

Huo
Beiträge: 614
Registriert: 26.11.2017 14:03:31
Wohnort: Freiburg

Re: Frage zu sed...

Beitrag von Huo » 31.05.2023 12:53:08

ts_berlin hat geschrieben: ↑ zum Beitrag ↑
31.05.2023 12:09:59
Befehl:

Code: Alles auswählen

sed -e '/Knox/{h;d}' -e '4G'
Der Befehl funktioniert offenbar nur dann wie gewünscht, wenn die zu verschiebende Zeile der Position, an der sie eingefügt werden soll, vorangeht:

Code: Alles auswählen

$ sed -e '/Adams/{h;d}' -e '4G' pres.txt 
George Washington, 1789-1797
Thomas Jefferson, 1801-1809
James Madison, 1809-1817
John Adams, 1797-1801
James Monroe, 1817-1825
Andrew Jackson, 1829-1837
Martin Van Buren, 1837-1841
William Henry Harrison, 1841
John Tyler, 1841-1845
James Knox Polk, 1845-1849

ts_berlin
Beiträge: 37
Registriert: 24.02.2003 17:48:35
Lizenz eigener Beiträge: GNU General Public License
Wohnort: Berlin
Kontaktdaten:

Re: Frage zu sed...

Beitrag von ts_berlin » 31.05.2023 13:00:29

@ Huo
ja, das hatte Meillo schon erwähnt...darauf muss man natuerlich erstmal kommen
@ tobo
noch ein Befehl, den man lernen muss ;-)

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Frage zu sed...

Beitrag von JTH » 31.05.2023 13:01:37

ts_berlin hat geschrieben: ↑ zum Beitrag ↑
31.05.2023 12:24:55
Konkret brauche ich nix, ausser die Skills.
Dann kann man dir ja einiges vorschlagen :)

Man könnte die Zeilenreihenfolge hier zweimal umdrehen, dann kommt das gewünschte heraus:

Code: Alles auswählen

tac presidents.txt | sed -e '/Knox/{h;d}' -e '7G' | tac

Und falls du es noch nicht kanntest, entdeckst du dabei gleich tac mit :)
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Frage zu sed...

Beitrag von Meillo » 31.05.2023 13:05:51

JTH hat geschrieben: ↑ zum Beitrag ↑
31.05.2023 13:01:37
Man könnte die Zeilenreihenfolge hier zweimal umdrehen, dann kommt das gewünschte heraus:

Code: Alles auswählen

tac presidents.txt | sed -e '/Knox/{h;d}' -e '7G' | tac
... plus die Zeilenzahl umrechnen! Dadurch wird's etwas unhandlich.

Den Ansatz von tobo mit dem Editor (sei es `ex' oder `ed', das macht wenig Unterschied) finde ich sinnvoll.

Alternativ koennte man (bei nicht allzu grossen Datenmengen) die Dateiinhalte auch einlesen und dann passend wieder ausgeben. Das ginge z.B. mit awk oder natuerlich jeder modernen Scriptsprache, wenn dir das lieber ist als der ex-Befehl.
Use ed once in a while!

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Frage zu sed...

Beitrag von JTH » 31.05.2023 13:08:37

Meillo hat geschrieben: ↑ zum Beitrag ↑
31.05.2023 13:05:51
... plus die Zeilenzahl umrechnen! Dadurch wird's etwas unhandlich.
Ja ja, ich wollt nur tac erwähnt haben, wenns hier erstmal ums Lernen geht :wink:
Manchmal bekannt als Just (another) Terminal Hacker.

Antworten