假设我有以下字符串:
some letters foo/substring/goo/some additional letters
我需要提取此子字符串,假设foo/
和/goo
是预先知道的常量字符串。我怎么能这样做?
答案 0 :(得分:2)
这个sed one-liner做到了。
sed 's#.*foo/##;s#/goo/.*##' file
除了sed,awk,grep也能做到这一点。或者使用zsh:
kent$ v="some letters foo/substring/goo/some additional letters"
kent$ echo ${${v##*foo/}%%/goo/*}
substring
$ {var %% / goo / *}中的var必须是变量名,不能是扩展的结果
如果使用bash,该行应分为两个语句。
$ echo $0
bash
$ v="some letters foo/substring/goo/some additional letters"
$ v=${v##*foo/}
$ v=${v%%/goo/*}
$ echo $v
substring
我在zsh中执行的行已经工作了,但只是我在bash中测试过,它没有用。
$ echo $0
-zsh
$ v="some letters foo/substring/goo/some additional letters"
$ echo ${${v##*foo/}%%/goo/*}
substring
答案 1 :(得分:2)
使用变量扩展
line='some letters foo/substring/goo/some additional letters'
line=${line%%/goo*} # remove suffix /goo*
line=${line##*foo/} # remove prefix *ffo/
echo "$line"
或bash正则表达式
line='some letters foo/substring/goo/some additional letters'
if [[ $line =~ foo/([^/]*)/goo ]]; then
echo "${BASH_REMATCH[1]}"
fi
答案 2 :(得分:2)
如果您知道“其他字母”中没有其他/
,则可以使用cut
:
> echo "some letters foo/substring/goo/some additional letters" | cut -d'/' -f2
答案 3 :(得分:1)
就可读性而言,我认为awk是一个很好的解决方案
echo "some letters foo/substring/goo/some additional letters" | awk -v FS="(foo/|/goo)" '{print $2}'