[Gelöst] Bestimmte Zeileninhalte mit Prefix ersetzen (Sed?)

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
hugediggs
Beiträge: 171
Registriert: 26.07.2012 22:40:23

[Gelöst] Bestimmte Zeileninhalte mit Prefix ersetzen (Sed?)

Beitrag von hugediggs » 30.10.2016 13:12:11

Ich habe hier eine sehr große Datei, welche u.a. Zahlen enthält wie "0123654".
Nun möchte ich, dass diese Zahlen ein Prefix bekommen, also aus "0123654" ein "12_0123654" wird, wenn "12_" das Prefix ist.
Der RegEx würde für die zusuchenden Zahlen [0-9]{6} lauten.

Code: Alles auswählen

grep "[0-9]\{6\}" myFile
spuckt mir alles wie gewünscht aus.
Laut Tante Google sollte sed zum gewünschten Ergebnis führen, wobei es mit einem Editor meiner Wahl (vim) auch gehen sollte. Die Schwierigkeit aus meiner Sicht besteht darin, dass ich keine Ahnung habe, wie ich die Suchstelle mit dem Prefix zusammenhänge, da alle Beispiele nur feste Ersetzungen vorstehen (foo statt bar). Würde ich find nutzen, würde ich dafür "{}" nehmen (was hier aber nutzlos ist).

Hat jemand von euch eine Idee?
Zuletzt geändert von hugediggs am 30.10.2016 13:38:04, insgesamt 1-mal geändert.

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

Re: Bestimmte Zeileninhalte mit Prefix ersetzen (Sed?)

Beitrag von Meillo » 30.10.2016 13:26:25

`&' im Ersatztext wird durch das ersetzt, das gematchted hat, also:

Code: Alles auswählen

s/[0-9]\{6\}/12_&/g
Use ed once in a while!

hugediggs
Beiträge: 171
Registriert: 26.07.2012 22:40:23

Re: Bestimmte Zeileninhalte mit Prefix ersetzen (Sed?)

Beitrag von hugediggs » 30.10.2016 13:37:27

Hier https://www.tutorialspoint.com/unix/uni ... ssions.htm wird aber davon gesprochen, dass es auch mit \1, \2 gehen soll.
Da kommt zumindest bei mir immer

Code: Alles auswählen

$ cat myFile | sed 's/[[:digit:]]/Number: \1 /' 
sed: -e Ausdruck #1, Zeichen 26: Ungültiger Verweis \1 im rechten Teil (`RHS') des `s'-Befehls
Deine Lösung hingegen funktioniert. Dafür ein fettes Danke.

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

Re: Bestimmte Zeileninhalte mit Prefix ersetzen (Sed?)

Beitrag von Meillo » 30.10.2016 13:48:14

hugediggs hat geschrieben:Hier https://www.tutorialspoint.com/unix/uni ... ssions.htm wird aber davon gesprochen, dass es auch mit \1, \2 gehen soll.
Was & fuer den Gesamtausdruck links ist, sind \1, \2, usw. fuer Klammerausdruecke. Du kannst das z.B. so verwenden:

Code: Alles auswählen

s/<h\([1-6]\)>\([^<]*\)<\/h\1>/Heading \1: \2/
Use ed once in a while!

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: [Gelöst] Bestimmte Zeileninhalte mit Prefix ersetzen (Se

Beitrag von rendegast » 30.10.2016 13:48:49

(Alternativ zu Meillos Erklärung)
hugediggs hat geschrieben: dass es auch mit \1, \2 gehen soll.
Da kommt zumindest bei mir immer

$ cat myFile | sed 's/[[:digit:]]/Number: \1 /'
sed: -e Ausdruck #1, Zeichen 26: Ungültiger Verweis \1 im rechten Teil (`RHS') des `s'-Befehls
Dafür braucht es (gequotete) Klammern:

Code: Alles auswählen

    $ cat myFile | sed 's/\([[:digit:]]\)/Number: \1 /'
Die nächste so eingefaßte Gruppe würde dann per \2 referenziert, usw.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

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

Re: Bestimmte Zeileninhalte mit Prefix ersetzen (Sed?)

Beitrag von Meillo » 30.10.2016 13:59:55

hugediggs hat geschrieben:Hier https://www.tutorialspoint.com/unix/uni ... ssions.htm wird aber davon gesprochen,
Allzuviel wuerde ich auf dieses Tutorial nicht geben. Dort wird gar nicht erwaehnt, dass es verschiedene Implementierungen von sed gibt und dass nicht alle davon die Features unterstuetzen, die im Tutorial beschrieben sind. Man sollte dem Tutorial also nicht blind vertrauen.

Man sollte in einem Tutorial entweder nur das portable Subset beschreiben, oder eben auf die Unterschiede eingehen. Oder man schreibt zumindest klar hin, dass es sich um ein Tutorial fuer GNU sed handelt.
Use ed once in a while!

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

Re: [Gelöst] Bestimmte Zeileninhalte mit Prefix ersetzen (Se

Beitrag von tobo » 30.10.2016 14:19:22

Damit die angegebene Länge von 6 (im Beispiel 7) auch Sinn bekommt und nicht nur Mindestlänge darstellen soll, vielleicht eher sowas:

Code: Alles auswählen

s/(^|[^0-9])([0-9]{6})([^0-9]|$)/\112_\2\3/g
Aufruf mit sed -r.

Antworten