仅使用awk:
> echo '$$DATABASE_AWESOME$$' | awk '{sub(/.*_/,"");sub(/\$\$$/,"");print tolower($0);}'
awesome
请注意,我在使用FreeBSD,因此这不是GNU awk。
但是这可以仅使用bash完成:
[ghoti@pc ~]$ foo='$$DATABASE_AWESOME$$'
[ghoti@pc ~]$ foo=${foo##*_}
[ghoti@pc ~]$ foo=${foo%\$\$}
[ghoti@pc ~]$ foo=${foo,,}
[ghoti@pc ~]$ echo $foo
awesome
在上述替换中,除了最后一个 (
${foo,,}
),其他都适用于标准 Bourne shell。如果你没有 bash,你可以使用
tr
来完成这一步骤:
$ echo $foo
AWESOME
$ foo=$(echo "$foo" | tr '[:upper:]' '[:lower:]')
$ echo $foo
awesome
$
更新:
根据评论,似乎OP真正想要的是从任何包含它的文本中去除子字符串--也就是说,我们的解决方案需要考虑在他在问题中提供的字符串之前或之后存在可能的前导或尾随空格。
> echo 'foo $$DATABASE_KITTENS$$ bar' | sed -nE '/\$\$[^$]+\$\$/{;s/.*\$\$DATABASE_//;s/\$\$.*//;p;}' | tr '[:upper:]' '[:lower:]'
kittens
如果你在路径中有 pcregrep
(从devel/pcre
FreeBSD端口安装),你可以使用它,带上后顾和前瞻:
> echo 'foo $$DATABASE_KITTENS$$ bar' | pcregrep -o '(?!\$\$DATABASE_)[A-Z]+(?=\$\$)' | tr '[:upper:]' '[:lower:]'
kittens
(对于阅读此内容的Linux用户:这相当于使用grep -P。)
(在纯bash中也可以用以下方式实现:)
$ shopt -s extglob
$ foo='foo $$DATABASE_KITTENS$$ bar'
$ foo=${foo##*(?)\$\$DATABASE_}
$ foo=${foo%%\$\$*(?)}
$ foo=${foo,,}
$ echo $foo
kittens
请注意,这三个更新的解决方案都无法处理同一输入行中存在多个已标记的数据库名称的情况。尽管在问题中没有将其说明为要求,但我只是说一下...。