mikrocontroller.net

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


Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
# Bei gleicher Stringlänge wird nichts verändert.
ALTERNAME=12345678 -> NEUERNAME=12345678  

# Bei kleinerer Stringlänge wird der neue Name von links mit der
# entsprechenden Anzahl von "_" aufgefüllt.
ALTERNAME=123 -> NEUERNAME=_____123       

# Bei grösserer Stringlänge wird der neue Name von rechts auf die Länge
# Länge 8 gekürzt.
ALTERNAME=123456789ABC -> NEUERNAME=12345678       

Ich arbeite mit Windows XP und verwende GNU make.


Weiss jemand wie das geht ?

Vielen Dank im voraus
Klaus

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Namesvetter,
jepp, ich habe sed auf dem Rechner.

Bye
Klaus

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt habe ich kein Windows greifbar (müsste ich erst booten).
Aber unter Linux klappt folgendes:
# Time-stamp: "26.01.10 16:23 makefile klaus?wachtler.de"
#

alt1 := "a234"
alt2 := "b2345678"
alt3 := "c234567890123456"


all :
  @echo $(shell echo  $(alt1)________ | sed -e 's/\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\).*/\1\2\3\4\5\6\7\8/')
  @echo $(shell echo  $(alt2)________ | sed -e 's/\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\).*/\1\2\3\4\5\6\7\8/')
  @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:
klaus@a64a:/tmp > make
a234____
b2345678
c2345678

Autor: Sven P. (haku) Benutzerseite
Datum:

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

:-)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, verloren.

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

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

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Ihr,

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


Merci
Klaus

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
macht nichts. Hauptsache ich bekomme meine 8 Zeichen.

Danke nochmal
Klaus

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein sed Aufruf reicht:
alt1 := "a234"
alt2 := "b2345678"
alt3 := "c234567890123456"


all :
    @echo $(alt1) | sed -e 's/^\(.\{8\}\).*/\1/' -e 's/\(.*\)/________\1/' -e 's/.*\(.\{8\}\)/\1/'
    @echo $(alt2) | sed -e 's/^\(.\{8\}\).*/\1/' -e 's/\(.*\)/________\1/' -e 's/.*\(.\{8\}\)/\1/'
    @echo $(alt3) | sed -e 's/^\(.\{8\}\).*/\1/' -e 's/\(.*\)/________\1/' -e 's/.*\(.\{8\}\)/\1/'

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja, ein sed mit 3 -e ...
:-)

Autor: Sven P. (haku) Benutzerseite
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.