使用單獨的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 –