Bash 匹配部分字符串
Bash matching part of string
假设我有一个像
这样的字符串
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/ 开始的最后一部分,即“prod/v1.8/pienug_ib-2/reco_c21_dr3809_r35057.dst
”。请注意 $s1 包含两次 "prod/".
在 bash 中最优雅的方法是什么?
使用 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
)
使用 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
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匹配。
假设我有一个像
这样的字符串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/ 开始的最后一部分,即“prod/v1.8/pienug_ib-2/reco_c21_dr3809_r35057.dst
”。请注意 $s1 包含两次 "prod/".
在 bash 中最优雅的方法是什么?
使用 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
)
使用 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
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匹配。