• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[solved] String Extrahieren

fabmo

Member
Hallo,

ich habe eine variable welche einen String enthält.
Aus diesem StrinG möchte ich den String Dose01 sowie die beiden darauf folgenden Zeichen heraustrennen. Da der Teilstring nicht immer an der selben Stelle steht kann ich "cut" schonmal nicht benutzen.

Was kann ich denn sonst nehmen?
 

abgdf

Guru
1.

http://tldp.org/LDP/abs/html/refcards.html#AEN20070

2. awk:

http://www.angelfire.com/linux/tux25/index.html#45

3. Perl

Gruß

P.S.: fabmo ? Verwandt mit

http://en.wikipedia.org/wiki/Mighty_Mo_(Kickboxer)

:?: :p
 

regexer

Advanced Hacker
4. sed

abgdf schrieb:
1.

http://tldp.org/LDP/abs/html/refcards.html#AEN20070
Aus dem Kopf heraus wüsste ich nicht, ob die Bash das bringt. Ich meine das "sowie die beiden darauf folgenden Zeichen".

Das geht natürlich.

Falls mit "heraustrennen" löschen gemeint ist wäre das ein simples
Code:
s/Dose01..//
Oder zu deutsch: ersetze Dose1 und zwei beliebiege Zeichen durch nichts.

sed würde ähnlich funktionieren...
 

abgdf

Guru
Hast recht:
Code:
echo "abcdDose1xydcba" | sed s/Dose1..//
stimmt irgendwie. Hatte mich von "extra(h)ieren" in die Irre führen lassen.

Gruß
 
OP
F

fabmo

Member
Hallo Hallo,

abgdf schrieb:
1.
P.S.: fabmo ? Verwandt mit

http://en.wikipedia.org/wiki/Mighty_Mo_(Kickboxer)

:?: :p

Nee eher nicht ....obwohl?

Naja mit extrahhhhhieren war eigentlich heraustrennen und weiterverwenden gemeint. Also Extrahieren halt. Ich guck ma eure Links durch..dafür nochmal vielen Dank. Wenn ichs hinkriege (oder nicht)poste ich..
 

regexer

Advanced Hacker
fabmo schrieb:
Naja mit extrahhhhhieren war eigentlich heraustrennen und weiterverwenden gemeint.
Sorry, dann habe ich das falsch verstanden.

sed (vielleicht verbesserungsbedürftig, aber mir fällt im Moment nichts besserers ein):
Code:
echo xxxxDose01abxxxx | sed 's/.*\(Dose01..\).*/\1/'

perl
Code:
echo xxxxDose01abxxxx | perl -ne 'print $1 if /(Dose01..)/'
 
OP
F

fabmo

Member
Hallo,

super vielen Dank mit sed funktioniert es auf jeden Fall. Kannst du mir vielleicht nochmal ganz kurz erklären, was die 1 am Ende zu bedeuten hat?

Danke
 

regexer

Advanced Hacker
fabmo schrieb:
Kannst du mir vielleicht nochmal ganz kurz erklären, was die 1 am Ende zu bedeuten hat?
\1 ist eine Referenz auf das, was im ersten Klammernpaar steht. \2 würde das zweite Klammernpaar referenzieren.

Der sed heißt also vereinfacht auf deutsch: Ersetze mir die ganze Zeile durch den Inhalt der Klammern.

Ich bin kein sed-Guru. Vielleicht geht es in sed noch elleganter, aber dazu müsste ich auch erstmal Literatur wälzen...
 
OP
F

fabmo

Member
Hallo,
noch ne Frage: wenn ich den ausgewerteten String in einer Schleife verschiedenen Variablen zuordnen möchte, müsste das doch so gehen oder?
Code:
typeset -i k
k=1

while [ $k -le 8 ]
do
STATE_DOSE$k=`echo $STATE | sed 's/.*\(Dose0$k....\).*/\1/'`
k=$k+1

done
leider funktioniert das nicht, da in der Varible STATE schon ein ` enthalten ist.
 

regexer

Advanced Hacker
fabmo schrieb:
leider funktioniert das nicht, da in der Varible STATE schon ein ` enthalten ist.
Schließe das sed-Kommando in doppelte statt in einfache Hochkommas ein. Nur dann wird $k von der Shell evaluiert.

Und noch etwas: STATE_DOSE$k= funktioniert so nicht. Für diesen Fall ist es besser, ein Array zu verwenden.
 
notoxp schrieb:
sed (vielleicht verbesserungsbedürftig, aber mir fällt im Moment nichts besserers ein):
Code:
echo xxxxDose01abxxxx | sed 's/.*\(Dose01..\).*/\1/'
perl
Code:
echo xxxxDose01abxxxx | perl -ne 'print $1 if /(Dose01..)/'
grep:
Code:
echo xxxDose01abxxx | grep -Po 'Dose01..'
 
Oben