Make: String mit vorgegebner Länge erzeugen

Gast #1570425
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
#1570911
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
Gast #1579819
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/'

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren