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 シェルで機能します。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
また、たまたま( FreeBSD ポートpcregrep
からの) パス上にある場合は、先読みを使用して代わりにそれを使用できます。devel/pcre
> 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
これら 3 つの更新されたソリューションのいずれも、同じ入力行に複数のタグ付きデータベース名が存在する状況を処理しないことに注意してください。それは質問の要件としても述べられていませんが、私はただ言っています....