使用单独的awk:
> echo '$$DATABASE_AWESOME$$' | awk '{sub(/.*_/,"");sub(/\$\$$/,"");print tolower($0);}'
awesome
请注意,我在FreeBSD下我,所以这不是GNU AWK。
但这可以单独使用bash来完成:
[[email protected] ~]$ foo='$$DATABASE_AWESOME$$'
[[email protected] ~]$ foo=${foo##*_}
[[email protected] ~]$ foo=${foo%\$\$}
[[email protected] ~]$ foo=${foo,,}
[[email protected] ~]$ echo $foo
awesome
上述换人,所有除了最后一个(${foo,,}
)将在标准Bourne shell中运行。如果你没有bash中,你可以做,而不是使用tr
此步骤:
$ echo $foo
AWESOME
$ foo=$(echo "$foo" | tr '[:upper:]' '[:lower:]')
$ echo $foo
awesome
$
UPDATE:
每评论,似乎什么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
。)
而且在纯击:
$ shopt -s extglob
$ foo='foo $$DATABASE_KITTENS$$ bar'
$ foo=${foo##*(?)\$\$DATABASE_}
$ foo=${foo%%\$\$*(?)}
$ foo=${foo,,}
$ echo $foo
kittens
注意,这三个更新解决方案都不会处理,其中多个标记在同一线路输入存在数据库名称的情况。这不是在这个问题中的要求,但我只是在说'...
http://stackoverflow.com/q/4569825/318716 –
http://stackoverflow.com/q/689495/318716 –