Попробуйте это,
sed -i 's/<FOLDER NAME="[A-Z]*"/<FOLDER NAME="'$FLDR'"/g' Gather.XM
Самый простой способ — выполнять их рекурсивно по одному:
filter() {
if [ "$#" -eq 0 ]
then
cat
else
f="$1"
shift
tee >(grep "$f" > "$f") | filter "$@"
fi
}
printf '%s\n' {foo,bar}{0..100} | filter foo bar r3
Однако это добавляет ряд дополнительных буферов и шагов, так что в качестве альтернативы вы можете осторожно использовать eval
. Это нормально, потому что имена файлов тщательно экранируются :
filter() {
cmd="tee "
for f in "$@"
do
cmd+=">(grep -e ${f@Q} > ${f@Q}) "
done
eval "$cmd"
}
Это можно сделать с помощьюeval
:
# usage xfilter filter_spec filter_args...
xfilter() {
local cmd flt=$1; shift
printf -v cmd " >($flt)" "$@"
eval "tee $cmd"
wait
}
$ echo paa | xfilter 'sed %q' s/a/e/g s/a/o/g
paa
pee
poo
$ tgrep(){ grep "$1" > "./$1"; }
$ printf '%s\n' foo bar | xfilter 'tgrep %q' foo bar
foo
bar
$ grep. foo bar
foo:foo
bar:bar
И нет, вообще никаких проблем с eval
при разумном использовании. В конце концов, bash будет вызывать eval
для каждой строки вашего скрипта отдельно, подумайте об этом на секунду.