Siduction Forum

Siduction Forum => Scripting & Kernelhacking => Topic started by: khx on 2010/12/19, 15:27:20

Title: [gelöst]String in Shell-Script parsen
Post by: khx on 2010/12/19, 15:27:20
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
Title: String in Shell-Script parsen
Post by: DonKult on 2010/12/19, 17:28:58
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...)
Title: Re: String in Shell-Script parsen
Post by: khx on 2010/12/19, 17:55:23
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
Title: [gelöst]String in Shell-Script parsen
Post by: khx on 2010/12/19, 18:28:15
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?
Title: [gelöst]String in Shell-Script parsen
Post by: bluelupo on 2010/12/19, 19:45:21
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
Title: Re: String in Shell-Script parsen
Post by: DonKult on 2010/12/19, 21:23:52
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"...
Title: [gelöst]String in Shell-Script parsen
Post by: khx on 2010/12/19, 22:21:29
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
Title: Re: String in Shell-Script parsen
Post by: khx on 2010/12/19, 23:00:49
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!
Title: [gelöst]String in Shell-Script parsen
Post by: bluelupo on 2010/12/20, 09:58:23
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)
Title: [gelöst]String in Shell-Script parsen
Post by: khx on 2010/12/20, 11:13:34
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