在bash中剪切子字符串

时间:2017-06-26 11:53:52

标签: bash substring

假设我有以下字符串:

some letters foo/substring/goo/some additional letters

我需要提取此子字符串,假设foo//goo是预先知道的常量字符串。我怎么能这样做?

4 个答案:

答案 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

请注意:

<@> @Nahuel Fouilleul的评论

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