Forum: PC-Programmierung Make: String mit vorgegebner Länge erzeugen


von Klaus (Gast)


Lesenswert?

Hi All,
ich grübel seid einiger Zeit an dem folgenden Problem und komme nicht 
weiter.

Ich möchte in "make" aus einen beliebigen Dateinnamen einen neuen 
Dateinnamen mit der Länge 8 erzeugen.

Es soll das folgende gewährleistet werden:
1
# Bei gleicher Stringlänge wird nichts verändert.
2
ALTERNAME=12345678 -> NEUERNAME=12345678  
3
4
# Bei kleinerer Stringlänge wird der neue Name von links mit der
5
# entsprechenden Anzahl von "_" aufgefüllt.
6
ALTERNAME=123 -> NEUERNAME=_____123       
7
8
# Bei grösserer Stringlänge wird der neue Name von rechts auf die Länge
9
# Länge 8 gekürzt.
10
ALTERNAME=123456789ABC -> NEUERNAME=12345678

Ich arbeite mit Windows XP und verwende GNU make.


Weiss jemand wie das geht ?

Vielen Dank im voraus
Klaus

von Klaus W. (mfgkw)


Lesenswert?

Direkt in make fällt mir da nichts ein.
Kannst du sed aufrufen (gibt es auch für Windows)?
Dann wäre es wohl deutlich leichter.

Auch Klaus.

von Klaus (Gast)


Lesenswert?

Hi Namesvetter,
jepp, ich habe sed auf dem Rechner.

Bye
Klaus

von Klaus W. (mfgkw)


Lesenswert?

Jetzt habe ich kein Windows greifbar (müsste ich erst booten).
Aber unter Linux klappt folgendes:
1
# Time-stamp: "26.01.10 16:23 makefile klaus?wachtler.de"
2
#
3
4
alt1 := "a234"
5
alt2 := "b2345678"
6
alt3 := "c234567890123456"
7
8
9
all :
10
  @echo $(shell echo  $(alt1)________ | sed -e 's/\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\).*/\1\2\3\4\5\6\7\8/')
11
  @echo $(shell echo  $(alt2)________ | sed -e 's/\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\).*/\1\2\3\4\5\6\7\8/')
12
  @echo $(shell echo  $(alt3)________ | sed -e 's/\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\).*/\1\2\3\4\5\6\7\8/')

Zur Erklärung:
ich hänge an den jeweiligen Namen 8 _ an, damit er erstmal
mindestens 8 Zeichen lang ist und kürze ihn anschließend
mit sed wieder auf 8 Zeichen. Letzteres mache ich mit Ersetzen
eines Musters: das erste Zeichen, also ein Punkt für "genau
ein Zeichen, egal welches" wird mit runden Klammern garniert
und damit im Ersetzungstext als \1 verwendbar, ebenso das
zweite Zeichen als \2 etc. bis \8. Der Rest (also .* im
Muster) wird nicht verwendet.

Ausgabe bei mir:
1
klaus@a64a:/tmp > make
2
a234____
3
b2345678
4
c2345678

von Sven P. (Gast)


Lesenswert?

Kleiner Hinweis am Rande:
1
sed -e "s/\(.\{8\}\).*/\1/"

:-)

von Klaus W. (mfgkw)


Lesenswert?

ok, verloren.

Aber meine Version sieht imposanter aus...  :-)

Außerdem war ich dafür bei den Anführungsstrichen sparsamer;
einfache reichen auch.

von Klaus (Gast)


Lesenswert?

Hi Ihr,

die Zeichen werden zwar hinten angefügt, aber ich haben meine definierte
Länge von 8 Zeichen.


Merci
Klaus

von Klaus W. (mfgkw)


Lesenswert?

sorry, hatte ich nicht genau genug gelesen.

Vorne geht mit einem Schritt mehr:
- mit sed erst auf 8 kürzen, falls länger
- Vorne 8 _ anfügen
- dann auf die letzten 8 Zeichen kürzen mit sed

Es wären dann also zwei sed-Aufrufe nötig.

von Klaus (Gast)


Lesenswert?

Hi,
macht nichts. Hauptsache ich bekomme meine 8 Zeichen.

Danke nochmal
Klaus

von ... (Gast)


Lesenswert?

Ein sed Aufruf reicht:
1
alt1 := "a234"
2
alt2 := "b2345678"
3
alt3 := "c234567890123456"
4
5
6
all :
7
    @echo $(alt1) | sed -e 's/^\(.\{8\}\).*/\1/' -e 's/\(.*\)/________\1/' -e 's/.*\(.\{8\}\)/\1/'
8
    @echo $(alt2) | sed -e 's/^\(.\{8\}\).*/\1/' -e 's/\(.*\)/________\1/' -e 's/.*\(.\{8\}\)/\1/'
9
    @echo $(alt3) | sed -e 's/^\(.\{8\}\).*/\1/' -e 's/\(.*\)/________\1/' -e 's/.*\(.\{8\}\)/\1/'

von Klaus W. (mfgkw)


Lesenswert?

naja, ein sed mit 3 -e ...
:-)

von Sven P. (Gast)


Lesenswert?

Lös so ein simples Problem mal unter einem Standard-Windows... SCNR :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.