Welcome, Guest. Please login or register.
Did you miss your activation email?

Author Topic: [DE] [gelöst]String in Shell-Script parsen  (Read 5812 times)

khx

  • Guest
[DE] [gelöst]String in Shell-Script parsen
« 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

DonKult

  • Guest
String in Shell-Script parsen
« Reply #1 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:
Code: [Select]
$ 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

  • Guest
Re: String in Shell-Script parsen
« Reply #2 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

khx

  • Guest
[gelöst]String in Shell-Script parsen
« Reply #3 on: 2010/12/19, 18:28:15 »
hab versucht, erstmal den Rattenschwanz abzuschneiden (alles was hinten keine zahl ist)
Code: [Select]
file1=1k11.04.xx.wav
s=${file1%%[^0-9]*}
echo $s

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

Offline bluelupo

  • User
  • Posts: 2.068
    • BluelupoMe
[gelöst]String in Shell-Script parsen
« Reply #4 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.
Code: [Select]

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

1k11.04

DonKult

  • Guest
Re: String in Shell-Script parsen
« Reply #5 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'

Code: [Select]
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

  • Guest
[gelöst]String in Shell-Script parsen
« Reply #6 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

khx

  • Guest
Re: String in Shell-Script parsen
« Reply #7 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!

Offline bluelupo

  • User
  • Posts: 2.068
    • BluelupoMe
[gelöst]String in Shell-Script parsen
« Reply #8 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

khx

  • Guest
[gelöst]String in Shell-Script parsen
« Reply #9 on: 2010/12/20, 11:13:34 »
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