단일 대체의 경우 중괄호는 제대로 작동
하지만 여러 대체에 대한 솔루션을 찾을 수 없습니다. 트릭은 무엇입니까?
또는
여러 교체의 경우 sed를 사용하고 단일 교체의 경우 중괄호 방법을 사용합니다.
#example vars
addons="WEBIF_LIVELOG WEBIF_JQUERY TOUCH WITH_SSL READ_SDT_CHARSETS WITH_DEBUG MODULE_MONITOR"
protocols="MODULE_hans MODULE_paul MODULE_klaus MODULE_franz"
readers="READER_foo READER_bar READER_foobar READER_barfoo"
card_readers="CARDREADER_type1 CARDREADER_type2 CARDREADER_type3"
_create_module_arrays(){
i=0;
for e in $(echo "$addons" | sed 's/WEBIF_//g;s/WITH_//g;s/MODULE_//g;s/HAVE_//g;s/_CHARSETS//g;);
do
<------>SHORT_ADDONS+=($e);
<------>SHORT_MODULENAMES+=($e);
done;
for e in ${protocols//MODULE_/};
do
<------>SHORT_PROTOCOLS+=($e);
<------>SHORT_MODULENAMES+=($e);
done;
for e in ${readers//READER_/};
do
<------>SHORT_READERS+=($e);
<------>SHORT_MODULENAMES+=($e);
done;
for e in ${card_readers//CARDREADER_/};
do
<------>SHORT_CARD_READERS+=($e);
<------>SHORT_MODULENAMES+=($e);
done;
for e in $addons $protocols $readers $card_readers;
do
<------>ALL_MODULES_LONG+=($e);
done;
for e in "${SHORT_MODULENAMES[@]}";
do
<------>INTERNAL_MODULES["$e"]="${ALL_MODULES_LONG[i]}";((i++));
done;
};
답변1
Bash에서 이러한 패턴을 제거하려면 확장 패턴 일치를 사용할 수 있습니다.
# optional - save extglob state
$ shopt -q extglob && extglob_disabled=false || extglob_disabled=true
# enable extended pattern matching
$ shopt -s extglob
$ addons="WEBIF_LIVELOG WEBIF_JQUERY TOUCH WITH_SSL READ_SDT_CHARSETS WITH_DEBUG MODULE_MONITOR"
$ echo ${addons//@(WEBIF_|WITH_|MODULE_|HAVE_|_CHARSETS)}
LIVELOG JQUERY TOUCH SSL READ_SDT DEBUG MONITOR
# optional - restore extglob state
$ $extglob_disabled && shopt -u extglob