[gelöst]String in Shell-Script parsen

Started by khx, 2010/12/19, 15:27:20

Previous topic - Next topic

khx

Moin,

ich hab hier Dateinamen im folgenden Format:
'.Z*0*\.0*\..*'
wobei Z: 'a' - 'z';  0: '0' - '9'
z.B: '3xy004.08.xx.wav' bzw. 'abc2.011.xx.wav'

diese möchte ich zu 3 Strings zerlegen:
'3xy' + '004' + '08'  bzw
'abc' + '2'   + '011'

wie macht man das am schlauesten?

Hermann

DonKult

Ob es schlau ist weiß ich nicht (ich tippe auf nein), aber mit sehr häßlichem sed könnte man folgendes tun:
$ echo -e '3xy004.08.xx.wav\nabc2.011.xx.wav' | sed "s#\([0-9]*[a-z]\+\)\([0-9]\+\)\.\([0-9]\+\).*#'\1' + '\2' + '\3'#"
'3xy' + '004' + '08'
'abc' + '2' + '011'

;)

P.S.: Beispiel 1. entspricht nicht deiner Spezifikation - ich hab daher mal anhand von Beispielen implementiert... (im Grunde entspricht kein Beispiel der Spezifikation - immerhin beginnt keines mit einem Punkt...)

khx

danke erstmal!

ich brauch das allerdings in drei Strings zum weiterverarbeiten

Quote from: "DonKult"P.S.: Beispiel 1. entspricht nicht deiner Spezifikation - ich hab daher mal anhand von Beispielen implementiert... (im Grunde entspricht kein Beispiel der Spezifikation - immerhin beginnt keines mit einem Punkt...)

tuts doch - wenn man den . als beliebiges zeichen sieht
ansonsten wäre es \.

Hermann

khx

hab versucht, erstmal den Rattenschwanz abzuschneiden (alles was hinten keine zahl ist)
file1=1k11.04.xx.wav
s=${file1%%[^0-9]*}
echo $s

leider bleibt dann nur noch 1 Zeichen übrig
was ist da falsch?

bluelupo

Wenn ich dich richtig verstanden habe willst du den hinteren Teilstring .xx.wav abscheneiden. Das würde so gehen.

file1=1k11.04.xx.wav
s=${file1%\.[a-z,A-Z]*\.[a-z,A-Z]*}
echo $s

1k11.04

DonKult

Quote from: "khx"
Quote from: "DonKult"P.S.: Beispiel 1. entspricht nicht deiner Spezifikation - ich hab daher mal anhand von Beispielen implementiert... (im Grunde entspricht kein Beispiel der Spezifikation - immerhin beginnt keines mit einem Punkt...)

tuts doch - wenn man den . als beliebiges zeichen sieht
ansonsten wäre es \.
In diesem Falle wären die Beispielzerlegungen aber:
(3 = .) 'xy' + '004' + '08'
(a = .) 'bc' + '2' + '011'

echo -e '3xy004.08.xx.wav\nabc2.011.xx.wav' | sed "s#.\([a-z]\+\)\([0-9]\+\)\.\([0-9]\+\).*#\1 \2 \3#" | while read line; do
 PART1="$(echo "$line" | cut -d' ' -f 1)"
 PART2="$(echo "$line" | cut -d' ' -f 2)"
 PART3="$(echo "$line" | cut -d' ' -f 3)"
 // do something fancy here instead of echo
 echo "## $PART1 ## PART2 ## $PART3 ##"
done

Output:
## xy ## 004 ## 08 ##
## bc ## 2 ## 011 ##


Mit cut kann man im allgemeine viel machen. Je nachdem was du machen willst geht das eleganter/schneller mit "awk"...

khx

Quote from: "bluelupo"Wenn ich dich richtig verstanden habe willst du den hinteren Teilstring .xx.wav abscheneiden. Das würde so gehen.

danke, genau,
genügt mir erstmal

würd mich aber trotzdem interessieren, wie man alle Zeichen die in einer Liste sind hinten abschneidet
${file1%[^0-9]*} killt nur das letzte
${file1%%[^0-9]*} killt zu viele (auch Ziffern)

Hermann

khx

Quote from: "DonKult"
In diesem Falle wären die Beispielzerlegungen aber:
(3 = .) 'xy' + '004' + '08'
(a = .) 'bc' + '2' + '011'

ich will schon das erste Zeichen im 1. String mit drin haben
mußte dazu nur den . in die Klammer verschieben

Quote from: "DonKult"Mit cut kann man im allgemeine viel machen. Je nachdem was du machen willst geht das eleganter/schneller mit "awk"...

Danke, guter Tipp!

bluelupo

Quote from: "khx"
[...]
würd mich aber trotzdem interessieren, wie man alle Zeichen die in einer Liste sind hinten abschneidet
${file1%[^0-9]*} killt nur das letzte
${file1%%[^0-9]*} killt zu viele (auch Ziffern)
Hermann

Guckst du hier

khx

Quote from: "bluelupo"Guckst du hier

da hatte ichs auch her ...

allerdings das Pattern hat hier nicht gepaßt,
da hier ein vereinfachtes verwendet wird
* statt .* für ne beliebige Zeichenkette
[...] beliebig oft dürfte also nicht machbar sein

Hermann