【发布时间】:2017-11-29 06:12:46
【问题描述】:
假设我有以下字符串:
some letters foo/substring/goo/some additional letters
我需要提取这个子字符串,假设foo/ 和/goo 是预先知道的常量字符串。我该怎么做?
【问题讨论】:
假设我有以下字符串:
some letters foo/substring/goo/some additional letters
我需要提取这个子字符串,假设foo/ 和/goo 是预先知道的常量字符串。我该怎么做?
【问题讨论】:
这个 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
【讨论】:
${var%%/goo/*} var 必须是变量名,不能是扩展的结果
带变量扩展
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
【讨论】:
如果您知道“其他字母”中没有其他/,则可以使用cut:
> echo "some letters foo/substring/goo/some additional letters" | cut -d'/' -f2
【讨论】:
$ echo "some letters foo/substring/goo/some additional letters" | awk -F/ '{ print $2}' )) 但你的选择更好。
/,如果“子字符串”包含/也会失败
/ 时。
就可读性而言,我认为 awk 是一个很好的解决方案
echo "some letters foo/substring/goo/some additional letters" | awk -v FS="(foo/|/goo)" '{print $2}'
【讨论】: