2016-08-05 28 views
1

Sagen wir, ich habe eine Zeichenfolge wieBash passenden Teil der Zeichenfolge

s1="sxfn://xfn.oxbr.ac.uk:8843/xfn/mech2?XFN=/castor/ 
    xf.oxbr.ac.uk/prod/oxbr.ac.uk/disk/xf20.m.ac.uk/prod/v1.8/pienug_ib-2/reco_c21_dr3809_r35057.dst" 

oder

s2="sxfn://xfn.gla.ac.uk:8841/xfn/mech2?XFN=/castor/ 
    xf.gla.ac.uk/space/disk1/prod/v1.8/pienug_ib-2/reco_c21_dr3809_r35057.dst" 

und ich möchte in meinem Skript den letzten Teil von prod beginnen zu extrahieren/d „prod/v1.8/pienug_ib-2/reco_c21_dr3809_r35057.dst“. Beachten Sie, dass $ s1 zwei Vorkommen von "prod /" enthält.

Was ist der eleganteste Weg, dies in bash zu tun?

+0

Ist es möglich, dass diese Strings * prod/'nicht * enthalten? Wenn ja, was ist dann das gewünschte Verhalten? – ruakh

Antwort

1

BASH Stringmanipulationen Verwendung können Sie tun:

echo "prod/${s1##*prod/}" 
prod/v1.8/pienug_ib-2/reco_c21_dr3809_r35057.dst 

echo "prod/${s2##*prod/}" 
prod/v1.8/pienug_ib-2/reco_c21_dr3809_r35057.dst 
+1

Danke! Das ist elegant und funktioniert perfekt! – A1g0r1thm

0

Mit awk (die ein wenig für diese überwältigt, aber es kann hilfreich sein, wenn Sie eine Datei voll von diesen Saiten haben Sie analysieren müssen:

echo "sxfn://xfn.gla.ac.uk:8841/xfn/mech2?XFN=/castor/xf.gla.ac.uk/space/disk1/prod/v1.8/pienug_ib-2/reco_c21_dr3809_r35057.dst" | awk -F"\/prod" '{print "/prod"$NF}' 

, die die Zeichenfolge ist Aufspalten von ‚/ prod‘ dann die in der Zeichenfolge '/ prod' Trennzeichen und das letzte Token Ausdrucken ($NF)

0

sed kann es gut tun:

s1="sxfn://xfn.oxbr.ac.uk:8843/xfn/mech2?XFN=/castor/xf.oxbr.ac.uk/prod/oxbr.ac.uk/disk/xf20.m.ac.uk/prod/v1.8/pienug_ib-2/reco_c21_dr3809_r35057.dst" 
echo "$s1" | sed 's/.*\/prod/\/prod/' 

dies beruht auf der earger Anpassung des .* Teil vorne.