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
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...)
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
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?
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
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"...
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
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!
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 (http://tldp.org/LDP/abs/html/string-manipulation.html)
Quote from: "bluelupo"Guckst du hier (http://tldp.org/LDP/abs/html/string-manipulation.html)
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