2016-08-05 57 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匹配。