2016-08-05 91 views
1

的一部分說我有喜歡猛砸匹配字符串

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" 

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" 

一個字符串,我想在我的腳本來提取督促開始/最後一部分,即「prod/v1.8/pienug_ib-2/reco_c21_dr3809_r35057.dst」。請注意,$ s1包含兩處「prod /」。

什麼是最優雅的方式來做到這一點在bash中?

+0

這些字符串可能不包含'prod /'嗎?如果是這樣的話,那麼 - 在這種情況下期望的行爲是什麼? – ruakh

回答

1

使用bash字符串操作,你可以這樣做:

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

謝謝!這是優雅的,完美的作品! – A1g0r1thm

0

使用awk(這是一個小制服了這一點,但如果你有一個完整的這些字符串,你需要解析的文件可能會有所幫助:

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}' 

這是由「/ PROD」分裂字符串然後打印出字符串中的 '/ PROD' 分隔符和最後一個令牌($NF

0

sed可以很好地做到這一點:

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/' 

這依賴於.*部分前面的earger匹配。